2012-05-30 3 views
3

В моем текущем проекте Im, использующем Threejs для построения уровня с сетками. Все графические элементы с камерой, сценой, проектором, визуализатором и т. Д. Выполняются в одном объекте. В целях тестирования я хочу сбросить всю сцену с разными параметрами, например, разными уровнями.Снижается производительность при попытке сбросить всю сцену с помощью Three.js

Поскольку я хочу измерить время алгоритма, я хочу «полный» сброс. Таким образом, мой текущий подход заключается в удалении div-box, содержащего сцену/холст, и удаление всего объекта с трехзначным кодом. После этого я создаю новый объект для графического уровня. К сожалению, это примерно 10 раз подряд приводит к резкому снижению производительности.

Я также попытался удалить все ячейки в сцене с помощью scene.delete() и удалить такие вещи, как сцена, рендеринга и т. Д., Прежде чем удалять весь объект. Но все-таки проблемы с производительностью.

Как я могу добиться полного сброса всех графических компонентов webgl без потери производительности?

Заранее спасибо.

+0

Какой браузер вы используете? Примерно через месяц я заметил замедление на моей странице WebGL в Chrome, которая сохраняется при перезагрузке страницы и сбрасывается, если я закрываю и снова открываю вкладку. –

+0

Да, я использую Chrome в новейшей версии (19). Но мои проблемы с производительностью прекращаются при перезагрузке страницы. В качестве промежуточного решения я теперь написал функцию для моего объекта, которая очищает все объекты, а не удаляет весь объект. Это работает без заметного снижения производительности, но было бы полезно узнать, есть ли способ сделать «полный» сброс. – DerDree

+0

renderer.deallocateObject может быть где-то посмотреть? –

ответ

1

две функции, которые могут увеличить вашу производительность переустановку: для каждого объекта obj в вашей сцене, попробуйте как:

scene.remove(obj); 
renderer.deallocateObject(obj); 
+2

R59 - obj.deallocate(); –

+0

Спасибо за обновление, Джим! –

3

Удаление все, чтобы сделать три не решит проблему, потому что даже ваша WebGLRenderer является удаленный, он никогда не выпускает его WebGL-контекст, поэтому вы оказываетесь одновременно с несколькими контекстами WebGL. Производительность будет ухудшаться для каждого дополнительного контекста в реальном времени. В конце концов, будет предел.

Обратитесь к this question за взломанный способ освобождения контекста.

Освобождение контекста не поддерживается three.js, поскольку вам действительно не нужно воссоздавать контекст. В моем случае, используя Angular с несколькими этапами приложения, где некоторые используют WebGL, а некоторые нет, я просто сохраняю экземпляр средства визуализации в контроллере уровня страницы, чтобы я мог получить доступ к нему в субконтроллерах, и поэтому никогда не нужно воссоздавать WebGLRenderer и, таким образом, контекст.

Смежные вопросы