javascript - Apakah objek WebGL dikumpulkan sampahnya?


Di JavaScript, memori yang saya alokasikan (misalnya ArrayBuffer) akan dibebaskan ketika saya tidak lagi memiliki referensi ke memori tersebut oleh GC, jika saya memahaminya dengan benar?

Objek WebGL seperti Buffer atau Tekstur terkait dengan blok memori di GPU sebagaimana dialokasikan oleh gl.bufferData() atau gl.textureImage2D().

Saya bertanya-tanya: jika saya melepaskan referensi terakhir saya ke objek WebGLTexture atau WebGLBuffer, apakah itu akan dikumpulkan sampahnya dengan blok memori GPU-nya dibebaskan secara otomatis oleh VM JavaScript?

Jawaban #1

Ya

Dari spesifikasi

Perlu dicatat bahwa objek GL yang mendasarinya akan otomatis ditandai untuk penghapusan ketika objek JS dihancurkan

Tetapi Anda harus memperhatikan bahwa objek mungkin tidak akan dihancurkan pada saat Anda melepaskan referensi terakhir, jadi tetap merupakan praktik yang baik untuk memanggil deleteBuffer.

Jawaban #2

Disalin dari jawaban ini: Apakah WebGLTextures dikumpulkan sampah?

dengan kata WebGLTexture diubah menjadi WebGLObject

Ya dan tidak.

Ya, mereka dikumpulkan sebagai sampah. Tetapi pengumpulan sampah terjadi kapan saja browser memutuskan untuk mengumpulkannya. Dari sudut pandang sebagian besar mesin JavaScript browser, objek WebGLObject adalah objek kecil yang hanya berisi int sehingga tidak ada cara mudah untuk mengetahui adanya tekanan khusus untuk mengumpulkannya. Dengan kata lain, ketika GPU kehabisan memori, pengumpul sampah JavaScript, yang tidak memiliki hubungan dengan GPU, tidak tahu bahwa ia perlu membebaskan objek kecil WebGLObject ini untuk mengosongkan memori tekstur. Itu hanya melihat memori CPU.

Ini sebenarnya adalah masalah yang dikenal dengan pengumpulan sampah. Ini bagus untuk memori. Ini tidak begitu bagus untuk sumber daya lainnya.

Jadi, ya, objek WebGLObject dikumpulkan oleh garbage collector dan ya tekstur/buffer/renderbuffer/program/shader akan dibebaskan tetapi secara praktis Anda perlu menghapusnya sendiri jika tidak ingin kehabisan memori.

Tentu saja browser akan membebaskan semuanya jika Anda menyegarkan halaman atau mengunjungi halaman baru di tab yang sama, tetapi Anda tidak bisa mengandalkan browser untuk mengumpulkan sampah objek WebGLObject (tekstur/buffer/renderbuffer/program/shader) dengan cara yang berguna.