Одним из главных показателей производительности является FPS, так как именно высокое FPS обеспечивает в динамичных сценах более высокую чёткость изображения и плавность перехода. Для увеличения FPS существует множество методов. Одни из этих методов нами будут рассмотрены в рамках данной работы. Способы оптимизации FPS:
- Объединять объекты, которые находятся рядом в один Actor для того, что они рисовались за меньшее количество draw calls. Этот метод, также, как и механизм Object Instancing, даст нам не плохую производительность за счет избавления от лишнего обмена между CPU и GPU при рендеринге. На рисунках 1, 2 в качестве примера показана производительность, достигаемая до и после объединения бутылок. Если обратить внимание, то можно заметить, что количество draw calls уменьшилось, а FPS увеличилось, после внесенных изменений. Для осуществления подобного объединения необходимо выделить желаемые объекты и нажать Merge Actors в контекстном меню.
- Уменьшение разрешения 4K текстур. Данный метод хорошо подходит не только для сокращения размеров приложения, но и для увеличения FPS. Для воплощения этого метода необходимо открыть в Content Browser текстуры с 4K разрешением и в настройках этих текстур увеличить значение LOD Bias на один.
- Увеличение количество LOD (Level of Detail). Этот подход позволит нам уменьшить количество треугольников используемых при прорисовке элементов. Он достаточно прост в реализации, так как от нас лишь требуется в настройках Static Mesh изменить параметр Number of LODs и Unreal Engine сам сгенерирует эти LOD.
- Уменьшение количество Static Mesh. В рассматриваемых проектах большое обилье однотипных элементов, которые рисуются при помощи отдельного Static Mesh (Например: пол и потолок). В целях оптимизации мы можем заменить эти однотипные элементы одним таким элементом с большим размером. Преимуществом будет опять же уменьшение количество draw calls. Единственное, кроме масштабирования, от нас будет требоваться правильно настроить UV.
- Разбиение сложных материалов на более простые. Не стоит делать один большой материал с множеством функционала, так как создается значительная нагрузка при рендеринге объектов, использующих подобный материал. В качестве примера можно рассмотреть MI_Green_plaster_wall, у которого родительский материал умеет создавать пыль, имитировать облезшую краску и т.п. Но при этом сам MI_Green_plaster_wall все это не использует в своей работе. Если обратиться к рисункам 3 и 4, то можно увидеть, насколько можно уменьшить граф после вынесения логики для MI_Green_plaster_wall.
- Удаление лишних элементов сцены. В представленной сцене к таким элементам можно отнести, например, объекты, расположенные в кладовке, к которой у пользователя нету доступа, а также источники света и отражающие элементы, которых достаточно много.
Рисунки 1-2 — Производительность достигаемая до и после объединения
Рисунки 3-4 — Исходный и новый материал
Диаграмма 1 — Сравнительная диаграмма способов оптимизации