Руководство по оптимизации
Вот несколько советов и рекомендаций по достижению хорошей производительности в вашем приложении PlayCanvas.
JavaScript
- Вызов 'new' для создания объекта JavaScript (особенно векторов, матриц и кватернионов) представляет собой динамическое выделение памяти и может быть дорогостоящим. Поэтому, где возможно, вы должны предварительно выделить объекты в функции инициализации скрипта и повторно использовать их в функции обновления. Это также приводит к сборке мусора, которая может вызывать периодические зависания.
Графика - CPU
- В PlayCanvas экземпляр сетки является вызовом отрисовки (командой для отрисовки отдельного графического примитива). Каждый вызов отрисовки требует определенных усилий на CPU для отправки в WebGL. Поэтому рекомендуется сохранять низкое количество вызовов отрисовки, особенно на мобильных устройствах. Вы можете увидеть список вызовов отрисовки для определенной модели, выбрав модель Asset и просмотрев ее в инспекторе. 100-200 вызовов отрисовки - это приблизительная цель для мобильных устройств с низким уровнем производительности. В то же время высокопроизводительные настольные компьютеры могут обрабатывать тысячи вызовов каждый кадр и все равно поддерживать 60fps.
- Используйте Batching для сокращения числа вызовов отрисовки. Создавая группы пакетов (Batch Groups) в вашем проекте и назначая их компонентам Render, Model и Element, движок будет стараться объединить их в как можно меньшее количество экземпляров сетки, сокращая вызовы отрисовки и повышая производительность.
- Старайтесь сохранять количество шейдеров, создаваемых вашим приложением, как можно меньше. Шейдеры должны компилироваться и связываться по запросу, и эта операция является затратной, вызывая задержки при запуске приложения и сбои в частоте кадров. Если у материала A есть эмиссионная карта, а у материала B - нет, будут сгенерированы два шейдера. Если установить черную эмиссионную карту на материал B, материалы могут использовать один и тот же шейдер. Уменьшение количества материалов в вашей сцене также должно сократить количество сгенерированных шейдеров.
- Для скиннутых сеток движок генерирует точные ограничивающие рамки (bounding box), требуемые для отсечения видимости камеры (camera frustum
culling), каждый кадр. Эта операция имеет стоимость для каждой кости и выполняется даже тогда, когда персонаж полностью находится за
пределами видимости. Чтобы избежать этой стоимости, рассмотрите возможность настройки пользовательского AABB для персонажа, который является
свойством компонента
Render
илиModel
. - Включайте отсечение пирамиды видимости на компоненте камеры только в том случае, если, в целом, это, вероятно, сэкономит больше производительности, чем потребуется для расчета видимости. Если вы отображаете сцену, где все экземпляры сетки всегда видны, отключите эту опцию.
Графика - GPU
- Будьте осторожны при включении 'Use Device Pixel Ratio' в настройках вашего проекта. Это заставит ваше приложение PlayCanvas использовать родное разрешение устройства, уменьшая пикселизацию, но может привести к значительному увеличению количества заполняемых пикселей, что может вызвать существенное снижение частоты кадров. Это можно настроить во время выполнения после оценки возможностей устройства пользователя. Подробнее читайте в Adjusting Device Pixel Ratio.
- Следите за количеством динамических источников света на вашей сцене. Стремитесь свести их количество к минимуму.
- При увеличении значения анизотропии текстур визуальное качество улучшается, но производительность снижается. Будьте осторожны, чтобы сбалансировать визуальные эффекты и производительность.
- Ищите возможности упаковать несколько текстур в одно изображение. Например, черно-белую карту прозрачности можно сохранить в альфа-канале диффузной карты. Или черно-белую карту блеска можно сохранить в альфа-канале спекулярной карты. Это приводит к меньшему использованию VRAM.
- Пост-эффекты могут быть дорогостоящими, поэтому тщательно подумайте, прежде чем включать их. Они могут стоить много с точки зрения заполнения пикселей.
- Включение отсечения обратных граней на материале будет дешевле, чем его отключение. В общем случае, отсечение обратных граней уменьшает количество пикселей, которые должна заполнить GPU. Это настройка по умолчанию для вновь созданных материалов.
Графика - CPU и GPU
- Для приложений, в которых мало визуальных изменений в течение определенного периода, таких как конфигураторы продуктов, существует
специальное свойство для снижения использования CPU и GPU.
pc.Application#autoRender
можно установить наfalse
, чтобы кадры отображались по запросу черезpc.Application#renderNextFrame
, когда происходит визуальное изменение, например, пользователь перемещает камеру или добавляет часть к продукту. - Включение теней на динамических источниках света дорого стоит. Тени от омни-света особенно дорогостоящие. Для каждого омни-света, который создает тень, сцена должна быть отрисована 6 раз в теневую карту.
- Сократите количество смешанных экземпляров сетки в вашей сцене до минимума. Смешанные сетки откладываются до тех пор, пока все непрозрачные экземпляры сетки не будут отправлены, и затем отправляются в порядке глубины камеры сзади вперед. Это приводит к многократному заполнению пикселей и может вызвать множество изменений состояния рендеринга, поскольку смешанные сетки не могут быть отсортированы по материалу.
Физика
- Сетки столкновений не обязательно должны иметь такой же уровень детализации, как и отображаемая сетка. Рекомендуется установить сетку с меньшим разрешением для столкновений.
- Сократите количество динамических твердых тел в вашей сцене до минимума, особенно на мобильных устройствах.