2016-05-06 48 views
6

Sto sviluppando un'applicazione WebGL per Web e dispositivi mobili. Io uso spesso aggiornamenti duri per testare i risultati della mia implementazione WebGL. Dopo tentativi vista, ottengo l'errore:Come liberare e garbage raccogliere un contesto WebGL?

Error: WebGL: Exceeded 16 live WebGL contexts for this principal, losing the least recently used one. 

Questo non appare su un browser fresco iniziata, ma dopo l'aggiornamento del sito più volte. Immagino che i contesti WebGL non siano finiti, rilasciati, distrutti, ripuliti, liberati correttamente.

Come posso fare questo?

Khronos Group ha creato una suite di test per la liberazione e la spazzatura raccolta contesto WebGL qui: https://www.khronos.org/registry/webgl/sdk/tests/conformance/context/context-creation-and-destruction.html (Nota: Questo potrebbe andare in crash il browser!)

Il test attraversa con PASS e TEST COMPLETE, quindi fondamentalmente il test non rileva qualsiasi problema Tuttavia, aprendo la console JavaScript, legge 33 istanze di:

Error: WebGL: Exceeded 16 live WebGL contexts for this principal, losing the least recently used one. 

È questo un bug nel modo in cui WebGL è gestito dal browser? O sto facendo qualcosa di sbagliato? Non ho mai pensato di liberare qualsiasi contesto WebGL.

Sto utilizzando Firefox Developer Edition 48.0a2 e Firefox 46.0.1.

Come liberare e garbage raccogliere un contesto WebGL?

risposta

2

Penso che forse ho frainteso la tua domanda

Tu dici che stai facendo rinfresca duri. Significa che stai premendo refresh nel browser? In quel caso per prima cosa disabiliterei tutte le estensioni e vedere se il problema è ancora lì. Se si tratta di file che avevo un bug con mozilla

caso contrario, se si sta cercando di tele libere e creare conosceva quelli e sperando per la raccolta dei rifiuti bene .. ecco la risposta che ho scritto prima che ho riletto la tua domanda


La risposta breve è che non è possibile forzare la garbage collection. Faresti meglio a riutilizzare le stesse tele.

C'è una soluzione qui per liberare tutti i dati e resettare la tela

How do I clean up and unload a WebGL canvas context from GPU after use?

Nel vostro caso particolare se sono sicuri al 100% che non stai tenendo a qualche riferimento al contesto WebGL o tela? Ad esempio, se lo fai

canvas.addEventListener('click', function(..) {}); 

Hai appena realizzato una tela che non può MAI essere raccolta. Ha una funzione listener di eventi allegata. Non hai modo di rimuovere quella funzione poiché non hai mantenuto un riferimento ad essa. Devi rimuovere tutti gli ascoltatori come solo un esempio di molti modi in cui potresti perdere dei riferimenti.

There's tons of ways to accidentally keep references to HTML elements like the canvas as well as WebGL objects. Conserva più di zero riferimenti e non sarà mai raccolto.

Here's some hints on finding the leaks

D'altra parte, se ero io che avrei provato riutilizzare le tele.Per essere sicuro di aver liberato tutto, potrei chiamare le mie funzioni di creazione/cancellazione che tengono traccia di tutte le risorse. Esempio

var textures = []; 
function createTexture(gl) { 
    var tex = gl.createTexture(); 
    textures.push(txt); 
} 

function deleteTexture(gl, tex) { 
    gl.deleteTexture(tex); 
    textures.splice(textures.indexOf(tex), 1); 
} 

Ora perché sto monitoraggio tutte le texture posso facilmente eliminare tutti i restanti

while (textures.length) { 
    gl.deleteTexture(textures.pop()); 
}