Очистка контекстов веб-контекста Threejs
У меня проблема при очистке моих WebGl-Scenes. Я использую Three.js с WebGlRenderer. В моем приложении мне приходится часто менять взгляды и, следовательно, нужно постоянно создавать новые сцены. Uptil теперь я уничтожаю и повторно инициализую всю сцену Threejs. После переключения сцен примерно в 15-20 раз я получаю следующее предупреждение:
WARNING: Too many active WebGL contexts. Oldest context will be lost.
После переключения в пару раз контекст полностью потерян и приложение сработает.
Есть ли способ уничтожить текущий контекст WebGl при очистке? Или WebGlRenderer всегда создает новый контекст WebGl при создании экземпляра?
Я использую Three.js R64.
Ответы
Ответ 1
Вы можете сохранить один и тот же рендерер для разных сцен. Редактору не важно, какую сцену он отобразит. Вы можете указать другой Scene
каждый раз, когда вы вызываете render()
, если хотите.
// instantiate only once and keep it
var renderer = new THREE.WebGLRenderer();
// current scene and camera. Switch whenever you like
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(...);
fillScene(scene);
// rendering always uses current scene
function render() {
renderer.render(scene, camera);
requestAnimationFrame(render);
}
/* ...
* somewhere in your application
* ...
*/
if(condition) {
// switch scene
scene = new THREE.Scene();
fillOtherScene(scene);
}
Ответ 2
У меня такая же проблема, но я не мог ее решить, используя SPA, из-за требований.
В этой ситуации существует метод .forceContextLoss() в WebGLRenderer (rev 71, возможно, был ранним).
Итак, мой код в методе "deallocate" аналогичен
_self.renderer.forceContextLoss();
_self.renderer.context = null;
_self.renderer.domElement = null;
_self.renderer = null;
Ответ 3
Вы должны создать и использовать только один WebGlRenderer. В моем SPA (одностраничном приложении) у меня возникла странная проблема с камерой/сценой в THREE.js после нескольких переадресаций. Это связано с тем, что WebGlRenderer был создан каждый раз, когда была отображена одна конкретная страница. Ошибка в консольном журнале (только предупреждение, которое вы написали).
Ошибка появилась как изменение положения камеры и проблем с рендерингом.