Подтвердить что ты не робот

Очистка контекстов веб-контекста 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.

4b9b3361

Ответ 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 был создан каждый раз, когда была отображена одна конкретная страница. Ошибка в консольном журнале (только предупреждение, которое вы написали). Ошибка появилась как изменение положения камеры и проблем с рендерингом.