【问题标题】:Cleaning up before an object is garbage-collected in javascript - how to?在 javascript 中对对象进行垃圾收集之前进行清理 - 如何?
【发布时间】:2019-04-17 22:12:12
【问题描述】:

当 Javascript 对象(在这种情况下,表示要绘制的形状)超出范围时,我想清理一些相关数据(在这种情况下,从 GPU 中删除 webgl 纹理) - 就在它之前垃圾收集。所以我一直在寻找类似finalize()destroy () 的东西,当Javascript 对象在垃圾收集之前失去它的最后一个引用时,我可以用它来删除webgl 纹理。

我浏览了web和stackoverflow,几乎到了相信Javascript没有这个功能的地步,但我不敢相信......在没有@987654323的情况下如何实现这个效果@ 等人?

【问题讨论】:

  • 不,你是对的:javascript 中没有析构函数。您必须手动跟踪引用。
  • 如果你说的那个对象超出了范围并丢失了它的最后一个引用,纹理不会随之被垃圾收集吗?
  • @itdoesntwork 不,必须显式创建和销毁 webgl 纹理,因为它们是 webgl 状态的一部分(如果我是对的,它存在于图形硬件上,并且没有参考返回到Javascript)。
  • Javascript 中没有垃圾收集或内存管理。
  • @Bergi 你好,亲爱的引用计数问题。你不是在跟我开玩笑吧?叹息。

标签: javascript garbage-collection


【解决方案1】:

所以没有办法知道 Javascript GC 什么时候会销毁一个对象。

(这个答案只是为了结束这个问题 - 是否存在更好的方法?)

【讨论】:

    【解决方案2】:

    我意识到这已经晚了六年,但是这个问题仍然出现在 Google 搜索中 - WebGL 规范似乎确实说当相应的WebGLBufferWebGLTexture 时,显卡上的缓冲区和纹理将被自动销毁被摧毁。例如见the documentation for deleteBuffer:

    如果缓冲区是由与此不同的 WebGLRenderingContext 生成的,则会生成 INVALID_OPERATION 错误。

    将传递的WebGLBuffer中包含的缓冲区对象标记为删除,就像调用glDeleteBuffers一样。如果对象已被标记为删除,则调用无效。请注意,当 JS 对象被销毁时,底层的 GL 对象将自动标记为删除,但是此方法允许作者提前标记对象以删除。

    【讨论】:

      猜你喜欢
      • 2012-03-26
      • 2011-07-16
      • 1970-01-01
      • 2019-09-04
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 2016-12-10
      相关资源
      最近更新 更多