2016-05-06 2 views
6

Я разрабатываю приложение WebGL для Интернета и мобильных устройств. Я часто использую жесткие обновления для проверки результатов моей реализации WebGL. После просмотра попыток, я получаю ошибку:Как бесплатно и мусор собирать контекст WebGL?

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

Это не появляется на свежем начал браузер, но после обновления сайта несколько раз. Я предполагаю, что контексты WebGL не закончены, выпущены, уничтожены, очищены, освобождены правильно.

Как это сделать?

Khronos Group создали тестовый набор для освобождения и мусора сбор контекст WebGL здесь: https://www.khronos.org/registry/webgl/sdk/tests/conformance/context/context-creation-and-destruction.html (Примечание: Это может привести к сбою ваш браузер!)

Испытание проходит через с PASS и TEST COMPLETE, поэтому поясню тест не обнаруживает любые вопросы. Однако, открыв консоль JavaScript, он читает 33 экземпляров:

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

Является ли это ошибка в том, как WebGL обрабатывается браузером? Или я делаю что-то неправильно? Я никогда не думал о том, чтобы освободить контексты WebGL.

Я использую Firefox Developer Edition 48.0a2 и Firefox 46.0.1.

Как бесплатно и мусор собирать контекст WebGL?

ответ

2

Я думаю, что, может быть, я неправильно понял ваш вопрос

Вы говорите, что вы делаете жесткие освежают. Значит, вы обновляете обновление в браузере? В этом случае сначала я отключу все расширения и посмотрю, все еще проблема. Если я файл ошибка с Mozilla

В противном случае, если вы пытаетесь свободных холстов и создать из них знал, и в надежде на сбор мусора хорошо .. вот ответ, который я написал, прежде чем я перечитал свой вопрос


Короткий ответ: вы не можете принудительно собирать мусор. Вам лучше было бы снова использовать те же холсты.

Там это решение здесь, чтобы освободить все данные и переустановить холст

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

В вашем конкретном случае, хотя вы 100% уверены, что не держит на некоторые ссылки на контекст WebGL или холст? Например, если вы это сделаете

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

Вы только что создали холст, который НИКОГДА не может быть собран из мусора. Он имеет функцию прослушивателя событий. У вас нет возможности удалить эту функцию, поскольку вы не указали на нее ссылку. Вам нужно удалить всех слушателей как один из примеров многих способов утечки ссылок.

There's tons of ways to accidentally keep references to HTML elements like the canvas as well as WebGL objects. Храните больше, чем нулевые ссылки, и это никогда не будет собирать мусор.

Here's some hints on finding the leaks

С другой стороны, если бы это было мне, я бы попытаться повторно использовать холсты.Чтобы убедиться, что я освободил все, что мог бы назвать мои собственные функции создания/удаления, которые отслеживают все ресурсы. Пример

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); 
} 

Теперь, потому что я отслеживать все текстуры можно легко удалить все оставшиеся из них

while (textures.length) { 
    gl.deleteTexture(textures.pop()); 
} 
Смежные вопросы