javascript - Hoće li objekti WebGL-a biti uklonjeni iz memorije?
U JavaScriptu memorija koju sam dodijelio (npr. ArrayBuffer) se oslobađa kada više nemam nikakvu referencu na nju, kako sam to pravilno razumio, od strane GC-a?
WebGL objekti poput Buffera ili Tekstura povezani su s blokom memorije na GPU-u kako je dodijeljeno pomoću gl.bufferData() ili gl.textureImage2D().
Pitam se: ako odustanem od svoje posljednje reference na WebGLTexture ili WebGLBuffer objekt, hoće li se automatski osloboditi putem zbrinjavanja smeća uz istodobno oslobađanje njegovog GPU memorijskog bloka od strane JavaScript VM-a?
Odgovor #1
Da
Prema specifikaciji
Imajte na umu da će osnovni GL objekt biti automatski označen za brisanje kada se JS objekt uništi
Ali trebali biste primijetiti da objekt vjerojatno neće biti uništen u trenutku kada odustanete od posljednje reference, pa je još uvijek dobra praksa pozvati deleteBuffer.
Odgovor #2
Kopirano iz ovog odgovora: Hoće li WebGLTextures biti očišćeni od smeća?
s riječi WebGLTexture promijenjenom u WebGLObject
Da i ne.
Da, oni se skupljaju putem sakupljanja smeća. Ali sakupljanje smeća događa se kad god preglednik odluči da ih sakupi. Iz perspektive većine JavaScript motora preglednika, objekt WebGLObject je mali objekt koji samo sadrži int, pa nema jednostavan način da zna za neki poseban pritisak za njegovo sakupljanje. Drugim riječima, kada GPU ostane bez memorije, JavaScript sakupljač smeća, koji nema veze s GPU-om, nema način da zna da treba osloboditi ove male WebGLObject objekte kako bi oslobodio memoriju tekstura. On gleda samo CPU memoriju.
Ovo je zapravo dobro poznat problem prikupljanja smeća. Odlično je za memoriju. Nije tako dobro za druge resurse.
Dakle, da, WebGLObject objekti se sakupljaju kao smeće i da, tekstura/pokazivač/renderbuffer/program/shader će biti oslobođeni, ali praktički govoreći, morate ih sami izbrisati ako ne želite da vam ponestane memorije.
Naravno, preglednik će ih sve osloboditi ako osvježite stranicu ili posjetite novu stranicu u istom kartici, ali ne možete se osloniti na preglednik da prikladno očisti WebGLObject objekte (teksture/puferi/renderbufferi/programi/shaderi).