javascript - WebGL 物件會被垃圾回收嗎?
在 JavaScript 中,我所分配的記憶體(例如 ArrayBuffer)會在我不再對其持有任何引用時,按照我的理解,被垃圾回收(GC)釋放掉嗎?
像 Buffer 或 Texture 這樣的 WebGL 物件,會與 GPU 上由 gl.bufferData() 或 gl.textureImage2D() 分配的記憶體區塊相關聯。
我在想:如果我放棄對 WebGLTexture 或 WebGLBuffer 物件的最後一個引用,它是否會被垃圾回收,並且其 GPU 記憶體區塊會自動被 JavaScript VM 釋放?
答案#1
是
根據規格
請注意,當 JS 物件被銷毀時,底層的 GL 物件將會自動標記為刪除
但你應該注意,當你放棄最後一個引用時,該物件可能不會立即被銷毀,所以呼叫 deleteBuffer 仍然是一個好的做法。
答案#2
從這個答案複製:WebGLTextures會被垃圾回收嗎?
將單詞 WebGLTexture 改為 WebGLObject
是也不是。
是的,它們會被垃圾回收。但垃圾回收會在瀏覽器決定收集它們時發生。從大多數瀏覽器 JavaScript 引擎的觀點來看,WebGLObject 物件只是包含一個 int 的小物件,因此它無法輕易知道有任何特殊的回收壓力。換句話說,當 GPU 記憶體用盡時,JavaScript 垃圾回收器與 GPU 沒有任何連接,因此無法知道它需要釋放這些小的 WebGLObject 物件以釋放紋理記憶體。它只會查看 CPU 記憶體。
這實際上是垃圾回收的一個眾所周知的問題。它對記憶體管理非常好,但對其他資源就不那麼好了。
所以,是的,WebGLObject 物件會被垃圾回收,且的確紋理/緩衝區/渲染緩衝區/程式/著色器會被釋放,但實際上,如果你不想耗盡記憶體,你需要自己刪除它們。
當然,如果你重新整理頁面或在同一個分頁中訪問新頁面,瀏覽器會釋放它們,但你不能指望瀏覽器以任何有用的方式回收 WebGLObject 對象(紋理/緩衝區/渲染緩衝區/程序/著色器)。