Вы можете просто потерять все ссылки на ваш gl-контекст и все объекты gl и холст и удалить холст из DOM. К сожалению, поскольку JavaScript-сборщик мусора не знает, когда браузер действительно освободит память. Есть несколько тестов соответствия, чтобы попытаться проверить, что они делают это правильно, но если вы не хотите просто надеяться и молиться тогда ....
Чтобы освободить все ваши ресурсы, вызвав gl.deleteXXX
на все, что вы создал и отвязал все точки привязки. Это означает, что для каждой текстурной единицы вызывается gl.bindTexture для всех целей с нулевым значением, то же самое с массивами, фреймбуфферами и рендерингами.
var numTextureUnits = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);
for (var unit = 0; unit < numTextureUnits; ++unit) {
gl.activeTexture(gl.TEXTURE0 + unit);
gl.bindTexture(gl.TEXTURE_2D, null);
gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);
}
gl.bindBuffer(gl.ARRAY_BUFFER, null);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
gl.bindRenderbuffer(gl.RENDERBUFFER, null);
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
// Delete all your resources
// Note!!!: You'd have to change this code to delete the resources YOU created.
gl.deleteTexture(someTexture);
gl.deleteTexture(someOtherTexture);
gl.deleteBuffer(someBuffer);
gl.deleteBuffer(someOtherBuffer);
gl.deleteRenderbuffer(someRenderbuffer);
gl.deleteFramebuffer(someFramebuffer);
Поскольку вы не можете привязать нуль к атрибуту, вы можете установить размер всех ваших буферов до 1 (ноль не разрешен), прежде чем вы удалите их. Либо это, либо создайте новый буфер и назначьте его всем атрибутам.
Пример первого
// set a buffer to 1 byte before deleting
// NOTE: You'd need to do this for ALL BUFFERS you created.
gl.bindBuffer(gl.ARRAY_BUFFER, someArrayBuffer);
gl.bufferData(gl.ARRAY_BUFFER, 1, gl.STATIC_DRAW);
gl.deleteBuffer(someArrayBuffer);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, someElementArrayBuffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, 1, gl.STATIC_DRAW);
gl.deleteBuffer(someElementArrayBuffer);
Или создайте новый буфер и назначьте его всем атрибутам
var buf = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf);
var numAttributes = gl.getParameter(gl.MAX_VERTEX_ATTRIBS);
for (var attrib = 0; attrib < numAttributes; ++attrib) {
gl.vertexAttribPointer(attrib, 1, gl.FLOAT, false, 0, 0);
}
Это отвяжет старые буферы от атрибутов.
Наконец, установите размер холста в 1x1 пиксель.
gl.canvas.width = 1;
gl.canvas.height = 1;
Это не идеальное решение, но оно будет немедленно освободите все, кроме нескольких килобайт памяти, не дожидаясь сбора мусора, который не поддается контролю.
Что касается повторного использования холста с нуля, вы не можете. Холст всегда будет иметь тот же контекст, который вы его сначала попросили.
Также см. Ответ @ Johan о loseContext