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