Домой › Форумы › Для программистов › Тормозит страница с несколькими iframe
Помечено: canvas, disableRendering, enableRendering, optimization, rendering
- В этой теме 8 ответов, 4 участника, последнее обновление 2 года назад сделано urcosmos.
-
АвторСообщения
-
15 ноября, 2021 в 15:31 #17446urcosmosCustomer
Коллеги, добрый день!
Подскажите, пожалуйста, что можно сделать.Ситуация:
Есть два проекта verge3d, вставленных на одну страницу. Каждый через свой <iframe>. Когда оба проекта загружены и готовы к работе, то навигация по странице становится затруднительной, тормозит даже скрол страницы.Подскажите можно ли оптимизировать работу на странице путем, например, отключения рендера одного проект verge, если он уже не виден на странице? Подскажите хотя бы примерно как это можно реализовать. Между вставками данных <iframe> есть контент и работать сразу с двумя загруженными проектами не будут. Но возможна ситуация, когда сначала посмотрят одну модель, потом пойдут вниз по станице, посмотрят вторую модель, а потом опять вернуться к первой.
Возможно есть другие решения?
Благодарю за внимание!
17 октября, 2022 в 16:36 #18071urcosmosCustomerUpdate:
Ввиду специфики работы отложил проекты в сторону. Недавно вернулся и с новым опытом решил вопрос по остановке рендера. Публикую на всякий случай, кому-то может пригодится.
В проекте нужно найти файл с именем “
названиемПроекта.js
“. В нем в конце будет пустая функцияrunCode(app)
. В нее я поместил код сIntersectionObserver
, который отслеживает попадает ли контейнер с приложением verge3d во вьюпорт. Если попадает, то включает рендеринг приложения, если не попадает, то выключает.На трех проектах проблему зависаний при просмотре сайта решил таким путем.
Код:
function runCode(app) { // add your code here, e.g. console.log('Hello, World!'); const cnvContainer = app.container; const options = { threshold: 0.1 }; const callback = function (entries, observer) { entries.forEach((entry) => { if (entry.isIntersecting == true) { app.enableRendering(); } else { app.disableRendering(); } }); }; const observer = new IntersectionObserver(callback, options); observer.observe(cnvContainer); }
19 октября, 2022 в 09:48 #18072Yuri KovelenovStaff20 октября, 2022 в 14:14 #18073kdvУчастникхорошая штука, но одно смущает: фпс не падает до 0, когда рендеринг отключен, остается на том же уровне. любопытно, есть ли способ приостановить работу приложения? как если бы свернул браузер или переключился на другое окно. в этих случаях фпс падает до 0.
Puzzles and JS coding. Fast and expensive.
If you don’t see the meaning in something it primarily means that you just don’t see it but not the absence of the meaning at all.
20 октября, 2022 в 14:45 #18074urcosmosCustomerЧетно говоря, еще не разбирался с этим. Где-то читал, что при отключении рендеринга какие-то внутренние расчеты все равно происходят каждый кадр.
У себя замечал только с анимацией такую ситуацию: предположим есть анимация перемещения объекта с 1 по 300 кадр. Запускаю. На 20 кадре выключаю рендеринг, все замирает. На 100 кадре включаю рендеринг и объект продолжает свою анимацию не там, где он остановился на 20 кадре, а там, где он должен быть на 100 кадре. Т.е. его анимация все равно просчитывается все время. Не силен пока в этом. Но отключение рендеринга все равно снижает нагрузку при просмотре.
Встречал одно из решений выключения объектов – воспользоваться методом
.dispose()
. Он вроде удаляет элементы. Применить его ко всему, что имеет такой метод в сцене (объекты, материалы и т.д.). Но я думаю, это не совсем подходящее решение, если использовать его с IntersectionObserver – при повторном попадании канваса во вьюпорт модель тогда будет загружаться заново, насколько я понимаю. Здесь не шарю. Лучше у спецов проконсультироваться.20 октября, 2022 в 14:53 #18075kdvУчастник. На 20 кадре выключаю рендеринг, все замирает. На 100 кадре включаю рендеринг и объект продолжает свою анимацию не там, где он остановился на 20 кадре, а там, где он должен быть на 100 кадре.
о том и речь: при отключении рендеринга приложение не приостанавливает работу, анимации и прочий движ выполняются, только их не видно ))) и на вращение/перемещение приложение реагирует, но не отображает изменения до включения рендеринга. а хотелось бы реально приостановить работу приложения…
Puzzles and JS coding. Fast and expensive.
If you don’t see the meaning in something it primarily means that you just don’t see it but not the absence of the meaning at all.
7 ноября, 2022 в 16:58 #18170Ivan LyubovnikovStaffа хотелось бы реально приостановить работу приложения…
Полностью остановить можно так:
app.renderer.setAnimationLoop(null); app.clock.stop();
А включить вот так:
app.animate(); app.clock.start();
Тут app.renderer.setAnimationLoop – это аналог requestAnimationFrame, который App использует, чтобы всё запустить. Если подать null, то все остановится, а app.animate() в свою очередь все снова запустит.
Останавливать/запускать app.clock не критично для производительности – он сам по себе отрабатывать все это время не будет. Но вот он ещё используется как счетчик для анимации, поэтому если его не останавливать, то в момент включения всего приложения он бы выдал, что с остановки прошел не 1 кадр, а столько сколько была пауза, и анимация соответственно пошла бы с этого кадра.
Co-founder and lead developer at Soft8Soft.
7 ноября, 2022 в 17:05 #18171kdvУчастникВот это реально тема! Спасибо за наводку
Puzzles and JS coding. Fast and expensive.
If you don’t see the meaning in something it primarily means that you just don’t see it but not the absence of the meaning at all.
7 ноября, 2022 в 17:58 #18172urcosmosCustomerИван, большое спасибо за информацию!
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.