Оптимизация сцен для повышения производительности ВебГЛ
В данной статье мы познакомим вас с несколькими методами оптимизации, которые хорошо зарекомендовали себя при создании интерактивных веб-приложений. Эта глава основана на презентации «Софт Эйт Софт» (англ.) на конференции «Вердж3Дей» проходившей в Нидерландах в 2019 году.
- Геометрия и меши
- Карты нормалей
- Текстурирование
- Вертексные цвета
- Количество шейдеров
- Вызовы отрисовки
- ХДР-освещение
- Тени
- Смотрите также
Геометрия и меши
В основе 3Д-приложений лежит геометрия, поскольку она формирует основу модели. Чтобы получить более гладкие отражения и ускорить рендеринг, необходимо чтобы сетка была как можно более равномерной, а топология правильной. Вначале следует определиться с уровнем детализации сцены и придерживаться его на протяжении всего процесса моделирования.
![Рекомендованная топология для ВебГЛ-приложений](files/optimization-techniques/topology.jpg)
При моделировании фасок лучше использовать группы сглаживания, вместо добавления дополнительных полигонов.
![](files/optimization-techniques/crease.jpg)
При работе над цилиндрической моделью приложите усилия, чтобы уменьшить количество многоугольников к ее центру.
![Оптимизация цилиндрической модели для ВебГЛ](files/optimization-techniques/cylindrical.jpg)
Не перегружайте модель лишними деталями, которые пользователь все равно не увидит. Как показано на рисунке ниже, грань, выделенная оранжевым цветом, определяет уровень детализации для всей модели, поэтому ее можно использовать в качестве ориентира.
![](files/optimization-techniques/details.jpg)
Карты нормалей
Одним из распространённых способов оптимизации производительности ВебГЛ является уменьшение количества полигонов путем запекания карты нормалей от высокополигональной модели к низкополигональной.
![Использование карты нормалей для ВебГЛ-сцен](files/optimization-techniques/normal-map.jpg)
Однако, из-за ограниченной точности 8-битного изображения, карты нормалей могут создавать видимые артефакты. Некоторые возможные решения показаны ниже, но они практически неосуществимы: использование изображения более высокой точности приведет к созданию более тяжелого файла, а второй подход требует много времени и не гарантирует чистого результата. Третий подход, однако, может сработать в случаяе: если у вас "грубые" поверхности, мы рекомендуем добавить шум в ваши материалы, чтобы уменьшить эти артефакты.
![](files/optimization-techniques/normal-map-problems.jpg)
Исходя из нашего опыта, для глянцевых объектов мы рекомендуем использование геометрии middle-poly с группами сглаживания и без карты нормалей.
![](files/optimization-techniques/normal-map-best-solution.jpg)
Наконец, вот несколько случаев, когда лучше использовать карту нормалей, а не высокодетализированную сетку:
- Ваш объект состоит из множества различных поверхностей.
- У вас шероховатая поверхность, которая не создает артефактов точности.
- Ваши объекты находятся на расстоянии или малы, поэтому пользователь не заметит никаких артефактов, даже при их наличии.
![Как использовать карты нормалей в ВебГЛ-приложениях](files/optimization-techniques/normal-map-usage.jpg)
Текстурирование
Вот типичный набор текстур, используемых в создании ПБР-материала.
![Типовой набор текстур для ВебГЛ приложений](files/optimization-techniques/textures.jpg)
Как вы можете заметить, большинство из них черно-белые. Поэтому вы можете объединять ч/б текстуры в РГБА-каналы одного изображения, до 4 карт на изображение.
![](files/optimization-techniques/textures-pack-rgba.jpg)
Если у вас есть только одна ч/б текстура, вы можете объединить ее с любой существующей РГБ-текстурой, упаковав ее в альфа-канал. Наконец, если у вас нет изображения, с которым данную текстуру можно совместить, вы можете преобразовать ваше ч/б изображение в формат jpeg со сжатием 95% и включенным режимом оттенков серого.
![Packing black/white textures into alpha channel](files/optimization-techniques/textures-pack-a.jpg)
Еще один способ уменьшить размер текстуры — оптимизировать текстурную развёртку. Чем компактнее развертка, тем эффективнее изображение будет использовать пространство текстуры. Поэтому вы можете получить изображения меньшего размера без потери качества.
![Оптимизация текстурной развёртки в ВебГЛ](files/optimization-techniques/uv-space.jpg)
Вертексные цвета
Использование вертексных цветов вместо изображений — эффективный способ ускорить загрузку и повысить общую производительность ВебГЛ-приложений. Не смотря на то, что необходимо добавить дополнительные ребра, которые будут служить для разделения различных вертексных цветов.
![](files/optimization-techniques/vertex-colors.jpg)
Вы также можете использовать вертексные цвета для определения шероховатости, металличности или спекуляра поверхностей, или любых других параметров. Ниже показан пример такого материала, в котором используются только вертексные цвета.
![](files/optimization-techniques/vertex-colors-pbr.jpg)
Количество шейдеров
Хорошей практикой является, малое количество различных материалов/шейдеров в вашей сцене. Обработка шейдеров в ВебГЛ приводит к длительной загрузке, что особенно заметно на «Виндоус». Кроме того, если у вас меньше шейдеров, движок будет тратить меньше времени на переключение между ними во время рендеринга, что повышает производительность.
Если у вас есть похожие материалы, которые отличаются только текстурами, вы можете использовать только один материал и загружать/заменять его текстуры во время работы приложения. Для этого можно использовать пазл replace texture или реализовать данный способ с помощью «Ява Скрипт». Это не только оптимизирует количество шейдеров, но и уменьшит количество изображений, загружаемых при запуске приложения.
![](files/optimization-techniques/replacing-textures.jpg)
Вот пример такой оптимизации. Все эти шины представлены только одним материалом и сконфигурированы путем замены его текстур.
![](files/optimization-techniques/replacing-textures-example.jpg)
Чтобы уменьшить количество шейдеров, вы можете объединить 2 или более простых материала в один большой более сложный материал. Эта техника особенно эффективна, если вы планируете переключаться между этими материалами (например, вы делаете приложение-конфигуратор), потому что она работает быстрее, а также позволяет анимировать переходы.
![](files/optimization-techniques/mixing-shaders.jpg)
Вызовы отрисовки
Кроме того, есть еще один важный аспект — количество вызовов отрисовки (draw calls). Это число можно получить из раздела Geometry Buffers вывода информации о производительности. Их число примерно соответствует количеству отдельных объектов, если для каждого объекта назначен только один материал, в то время как для рендеринга объектов из нескольких материалов требуется еще больше вызовов рисования.
Поэтому следует стремиться объединять меши, когда это возможно, и использовать меньше уникальных материалов, чтобы уменьшить количество вызовов отрисовки и улучшить производительность.
![](files/optimization-techniques/materials-number.jpg)
Если у вас есть анимированный объект, вы можете соединить его части вместе и использовать кости для анимации, что иногда удобнее даже при анимации отдельных объектов.
![](files/optimization-techniques/materials-number-armature.jpg)
ХДР-освещение
Это помогает значительно улучшить производительность, если вы освещаете сцену только ХДР-изображением (.hdr), не используя никаких источников света. Файл ХДР может весить менее 1 Мб.
![Использование ХДР-текстуры окружения вместо источников света для улучшения производительности ВебГЛ](files/optimization-techniques/hdr-image.jpg)
Тени
Используйте динамические тени только тогда, когда они помогают красиво представить объект. На рисунке ниже динамические тени, используемые в демонстрации промышленного робота, подчеркивают форму модели робота. Саму модель можно поворачивать, поэтому тени не могут скрыть от пользователя какую-либо часть объекта. С другой стороны, тени в демонстрационном ролике Scooter затенили бы многие интересные для пользователя детали.
![](files/optimization-techniques/dynamic-shadows.jpg)
Если объект статичен, можно запечь карты теней и окклюзии и применить их к плоскости под объектом.
![](files/optimization-techniques/baked-shadows.jpg)
Смотрите также
Ознакомьтесь с разделом «Поиск проблем с производительностью», чтобы узнать, как обнаружить проблемные места в производительности вашего приложения, и с разделом «Компрессия ассетов», чтобы узнать, как сделать ваши сцены еще более компактными.
Остались вопросы?
Задайте их на нашем форуме!