Очистить контекстах с WebGL, Threejs

У меня проблема при очистке моих WebGL-сцен. Я использую три.js с WebGlRenderer. В моем приложении я должен довольно часто менять представления и поэтому должен все время отображать новые сцены. До сих пор я разрушаю и повторно инициализирую всю сцену Threejs. После переключения сцен около 15-20 раз я получаю следующее предупреждение:

WARNING: Too many active WebGL contexts. Oldest context will be lost.

после переключения еще пару раз контекст теряется полностью и приложение крахи.

есть ли способ уничтожить текущий контекст WebGl при очистке? Или WebGlRenderer всегда создает новый контекст WebGl при создании экземпляра?

Я использую три.js R64.

3 ответов


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

У меня такая же проблема, но я не мог решить ее с помощью SPA из-за требований.

есть .метод forceContextLoss () в WebGLRenderer (rev 71, возможно, был ранним) для этих ситуаций.

Итак, мой код в методе "освободить" - это somemethig, как

_self.renderer.forceContextLoss();
_self.renderer.context = null;
_self.renderer.domElement = null;
_self.renderer = null;

вы должны создать и использовать только один WebGlRenderer. В моем СПА (одностраничное приложение) у меня была странная проблема с камерой/сценой в трех.js после нескольких перенаправлений. Это было потому, что WebGlRenderer был создан каждый раз, когда одна конкретная страница была отображена. В журнале консоли не было ошибки (только предупреждение, которое вы написали). Ошибка появилась в виде изменения положения камеры и проблем с рендерингом.