Признайтесь, вы подумали о S.T.A.L.K.E.R. 2, который как раз разрабатывают на Unreal Engine 5. Но это не он.
В данной статье я хочу сравнить прозводительность UE4 и UE5, используя ассеты оригинального Сталкера.
Предистория
Году в 2018 я загорелся идеей изучить Unreal Engine 4 и заодно создать на нём свою игру. Я сперва потыкался в редакторе сам, потом прошёлся по обучающим роликам, но никак не мог придумать что именно я хочу сделать, а также где взять ассеты для игры. Сам то я умею только программировать.
И тут мне в рекомендации на ютубе попадается видео с названием навроде «Я перенёс СТАЛКЕР на Unreal Engine 4 !!!11». Заголовок звучал громче чем само видео, потому что автор только импортировал одну из мультиплеерных карт оригинальной трилогии, натянул оригинальные текстуры, добавил траву, источники освещения и сказал «Вах как красиво!». Однако, это видео всё равно было очень полезно, потому что оно содержало инструкцию о том, где взять оригинальные ассеты и как их импортировать. А заодно это видео намекнуло мне, что я хочу сделать именно сталкера. Я же как раз фанат этой серии игр!
И что же вышло?
Понимая, что полноценная одиночная кампания мне не по силам, я решил сделать мультиплеер. Я опущу 2 года чтения мануалов движка, создания материалов и конечно же написания основного кода игры, так как это не по теме.
В итоге имеем:
-
Портированы Затон из «Зова Припяти» и Бар из «Чистого Неба»
-
Портированы все текстуры и сделаны материалы, которые могут правильно воспользоваться оригинальными текстурами
-
Собственная система погоды, которая может выдать и солнечный день, и туман, и сильный ливень в ночи
-
Собственная система предметов и инвентаря
-
Собственная система стрельбы
-
Реализованы режимы «Battle Royale» и «Deathmatch», в которые можно поиграть на Затоне и в Баре соответственно
-
Внедрены необходимые оптимизации дабы всё это работало на моих тогдашних Intel Core i3 3rd gen и Nvidia 1050ti и выдавало минимум 60 кадров в секунду на максимальных настройках
А можно увидеть своими глазами?
Вы можете увидеть финальную графику здесь:
А геймплей Королевской Битвы здесь (геймплей записывался на старой графике):
Также можете пощупать всё сами, скачав игру отсюда
Игра работает только в мультиплеере и ищет сервера через Steam, поэтому вам нужно сперва пробросить к себе порт 27016
, потом запустить сервер через StartServer.bat
и зайти на него. По умолчанию запустится Королевская Битва и для старта матча нужно минимум 2 игрока. Чтобы поменять настройки сервера вам нужно зайти в папку StalkerMP\Config
и переименовать _Server_BR.cfg
либо _Server_DM.cfg
в Server.cfg
, а также отредактировать настройки в этих файлах как вам угодно.
Правда я забросил всё это летом 2020 года, потому что устал работать в одиночку и не смог набрать достаточно игроков чтобы подталкивать меня к дальнейшей разработке…
А причём здесь Unreal Engine 5?
В декабре 2021 я решил глянуть как всё это будет работать на новом движке от Epic Games, благо он может запускать проекты для UE4 без дополнительных телодвижений (что намекает на то, что это просто дальнейшее развитие UE4, а цифра 5 в названии ради маркетинга).
Ещё стоит упомянуть, что разрабатывал я на Intel Core i7 3-го поколения и Nvidia GeForce 1050ti и соотствественно оптимизировал в первую очередь под них. Для разбирающихся, я в основном полагался на Hierarchical Level of Detail (HLOD), а также пришлось оптимизировать некоторые материалы при помощи вставок на чистом DirectX SM5. При этом я не использовал обычный LOD.
А сравнения снизу уже сделаны на AMD Ryzen 9 5900X и Nvidia RTX 3080ti, из-за чего использование того же HLOD не даёт практически никакого прироста производительности.
Ну и, в конце концов, оригинальные модели делались для собственного движка студии GSC Game World ещё в нулевые, а используемая в данном сравнении карта Затон была выпущена в 2009 году. Поэтому и количество полигонов и разрешение текстур соотвествующее. К примеру, в наше время моделька одного персонажа может иметь больше полигонов, чем любая из карт Сталкера целиком.
Также, чтобы полностью понять сравнения снизу, рекомендую почитать про систему Nanite, которая является главным нововведением в UE5. Грубо говорят, при включенном Nanite движок самостоятельно генерирует LOD и переключается между ними так, чтобы это не было заметно глазу. Также в UE5 добавили систему Lumen, но её в данном посте не будет.
Собственно, сравнение
Тестирование проводилось в полностью скомпилированной игре, чтобы интерфейс редактора не влиял на результаты.
Сравнивать я буду одни и те же сцены, все на карте «Затон», но в разных сценариях:
-
Изначальная сцена на UE4 со всеми оптимизациями, включая HLOD
-
Та же сцена с теми же оптимизациями, но на UE5. Система Nanite при этом включена, но в сцене нет ни одной модели, которая её использует.
-
Та же сцена с теми же оптимизациями на том же UE5, но с полностью выключенном Nanite (
r.Nanite 0
в консоли) -
Та же сцена на UE5 с полностью активным Nanite и без HLOD
Я не нашёл как сделать удобное сравнение картинок на хабре (это вообще возможно?), поэтому рекомендую открывать их в отдельной вкладке и сравнивать самостоятельно. Вы можете увидеть частоту кадров справа вверху, а более подробная статистика находится после основных выводов.
Вид с «Шевченко» на «Станцию переработки отходов»
Вы можете заметить слегка разное освещение. Это из-за того, что UE5 принудительно включил авто экспозицию, хотя я отключал её в проекте на UE4. Это нужно для Lumen, потому что иначе оно выглядит хуже. Мне же авто экспозиция не нужна, поэтому я захардкодил минимальное и максимальное значение экспозиции так, чтоб оно выглядело примерно как на UE4
Несмотря на одинаковые настройки, UE5 рендерит объекты слегка по разному:
Производительность UE5, однако, оставляет желать лучшего:
Движок |
FPS |
% FPS |
UE4 |
293 |
100 % |
UE5 при не используемом Nanite |
134 |
46 % |
UE5 при выключенном Nanite |
209 |
71 % |
UE5 при используемом Nanite и без HLOD |
101 |
34 % |
Вид с болота на «Шевченко»
Здесь можно заметить, что Nanite слегка двигает координаты текстур, что видно на материале земли на последних двух скриншотах.
Движок |
FPS |
% FPS |
UE4 |
267 |
100 % |
UE5 при не используемом Nanite |
132 |
49 % |
UE5 при выключенном Nanite |
198 |
74 % |
UE5 при используемом Nanite и без HLOD |
98 |
37 % |
Вид внутри «Скадовска»
В данной сцене присутствует 4 стационарных (stationary) источников света
Включение Nanite изменило освещение помещения, что видно на последних двух скриншотах сверху. На мой взгляд без него выглядит чуть более естественно.
Движок |
FPS |
% FPS |
UE4 |
350 |
100 % |
UE5 при не используемом Nanite |
162 |
46 % |
UE5 при выключенном Nanite |
264 |
75 % |
UE5 при используемом Nanite и без HLOD |
114 |
33 % |
Вид с опоры ЛЭП на почти всю карту
На данной сцене вы можете увидеть баг в UE5, когда при определённом положении и повороте камеры объекты в кадре становятся чёрными, но иногда отрисовываются нормально. Как я понял из гугла, тот же самый баг присутствует и в UE 4.26 (я использовал 4.25), то есть UE5 тут не виноват. Баг как-то связан с драйверами Nvidia и для починки надо откатиться на более старую версию. Я не хотел этого делать, поэтому оставил как есть. Я не заметил какого-либо влияния бага на производительность, поэтому считаю сравнение честным.
Стоит заметить, что Static Mesh с Opaque материалами не видно вообще (ландшафт, корабли, стволы деревьев), в то время как Static Mesh с Masked материалами мерцают (кусты и листва деревьев), а Instanced Foliage (трава) не затронут вообще. При этом баг не затрагивает Static Mesh, для которых включён Nanite (последний скриншот). Однако, Nanite не работает с Masked материалами, поэтому кусты и деревья всё ещё мерцают.
Ещё забавно то, что баг не проявляется в редакторе, но проявляется в скомпилированном проекте.
Движок |
FPS |
% FPS |
UE4 |
230 |
100 % |
UE5 при не используемом Nanite |
131 |
56 % |
UE5 при выключенном Nanite |
176 |
77 % |
UE5 при используемом Nanite и без HLOD |
79 |
34 % |
Вид с опоры ЛЭП на почти всю карту без прямого солнечного освещения
Описанный выше баг в UE5 присутствует и здесь.
В данном случае отключено солнечное освещение, поэтому производительность выше.
Движок |
FPS |
% FPS |
UE4 |
256 |
100 % |
UE5 при не используемом Nanite |
139 |
54 % |
UE5 при выключенном Nanite |
222 |
87 % |
UE5 при используемом Nanite и без HLOD |
89 |
35 % |
Вид с опоры ЛЭП на почти всю карту при сильном ливне (нет солнца и очень много полупрочзачного дождя)
Казалось бы, дальние объекты не видно, а значит они не должны отрисовываться и производительность должна быть выше. Жаль, что движок не учитывает глубину тумана (капли дождя видны только вблизи, а эффект дождя вдали — на самом деле туман) при вырезании невидимых объектов, поэтому он сперва отрисывывает всё, а потом закрашивает туманом. При этом производительность только ниже чем в солнечный день, а всё из-за множества полупрозрачных (Translucent) частиц дождя.
Движок |
FPS |
% FPS |
UE4 |
164 |
100 % |
UE5 при не используемом Nanite |
131 |
80 % |
UE5 при выключенном Nanite |
142 |
87 % |
UE5 при используемом Nanite и без HLOD |
81 |
49 % |
Нет, я не перепутал скриншоты. Я ожидал, что Nanite будет посередине между включённом, но не используемом, и полностью выключенном. Но нет, он показал себя хуже всех… И это странно, потому что если убрать HLOD, оставить Nanite включённым, но не используемым, то fps падает всего на 1 на текущем железе (На старом железе разница была большая, но цифр у меня уже нет). Я не знаю что здесь не так.
Опять же напомню, что все эти ассеты создавались для игры 2009 года и для совершенно другого движка, и полигонов там по современным меркам мало, а Nanite из UE5 делается для очень многополигональных сцен. Но это всё равно странно!
Однако производительность падает даже при выключенном Nanite. Это точно не Lumen, я проверял, это что-то ещё…
Куда уходят драгоценные милисекунды?
В данной главе сравниваются данные, отображаемые консольными командами stat gpu
и stat rhi
в попытке понять, какой компонент движка стал хуже делать свою работу. Если вам такое не интересно, можете пройти сразу к выводам.
Компонент |
Объяснение |
Prepass |
Подготовка сцены к отрисовке |
Basepass |
Собственно, базовая отрисовка сцены |
Shadows |
Просчёт и наложение теней. Сюда включены Shadow Depths и Shadow Projection. |
HZB |
Расчёт глубины сцены. Это нужно для исключения невидимых объектов из дальнейшей обработки. |
SSAO |
ScreenSpace Ambient Occlusion |
Postprocessing |
Постпроцесс, то есть наложение дополнительных эффектов поверх уже отрисованной сцены |
Translucency |
Просчёт полупрозрачных объектов |
GPU Scene Update |
Я не знаю что это, гугл тоже не помог |
Nanite |
Собственно, новая технология в UE5. Включает все строки с Nanite в названии. |
[unaccounted] |
Некие расчёты видеокарты, которые движок не смог отследить |
Triangles drawn |
Количество отрисованных полигонов |
Вид с «Шевченко» на «Станцию переработки отходов»
UE4 |
UE5, |
UE5, |
UE5, |
|
Prepass |
0.58 |
0.57 |
0.57 |
0.57 |
Basepass |
0.71 |
0.97 |
0.92 |
2.24 |
Shadows |
1.19 |
2.01 |
1.11 |
2.79 |
HZB |
0.37 |
0.18 |
0.15 |
0.25 |
SSAO |
0.28 |
0.26 |
0.26 |
0.33 |
Postprocessing |
0.35 |
0.32 |
0.35 |
0.34 |
Translucency |
0.14 |
0.19 |
0.17 |
0.28 |
GPU Scene Update |
0.00 |
1.91 |
1.64 |
1.96 |
Nanite |
— |
1.22 |
— |
2.23 |
[unaccounted] |
0.12 |
0.20 |
0.88 |
0.21 |
Triangles drawn |
1,210,837 |
19,180 |
19,298 |
1,663,262 |
Уже в первой сцене можно заметить причину тормозов:
-
Basepass
в UE5 подскакивает на 0.20 ms даже без Nanite, а с ним вообще отбирает больше 2 ms! -
Nanite также требует значительно больше времени на
Shadows
, а вот без него производительность даже немного улучшилась. -
Также в UE5 оптимизировали
HZB
, либо же часть его работы попадает в[unaccounted]
. -
SSAO
работает чуть-чуть быстрее в UE5 без Nanite, но медленнее если его включить. Разница, впрочем, мизерная. -
Postprocessing
тоже стал чуточку быстрее. -
Расчёты
Translucency
стали медленнее во всех случаях, а с Nanite так вообще в 2 раза хуже. -
GPU Scene Update
не отнимал вообще нисколько времени в UE4, а в UE5 неожиданно стал отнимать больше полутора миллисекунд. -
Ну и, собственно, сам
Nanite
, к сожалению, скорее уменьшает производительность, так как в сцене изначально не так уж много полигонов чтоб их оптимизация давала эффект. -
К слову о полигонах. UE5 почему-то не учитывает большинство отрисованных полигонов в своей статистике если Nanite не используется. Сам Nanite при этом проигрывает HLOD в количестве вырезанных полигонов на целых 250 тысяч. Впрочем, хоть я это и не показал в статье, эта же сцена на UE4 без HLOD отрисовывает примерно 1,750,000 треугольников, так что Nanite всё же немного свою работу делает.
Вид с болота на «Шевченко»
UE4 |
UE5, |
UE5, |
UE5, |
|
Prepass |
0.62 |
0.48 |
0.48 |
0.49 |
Basepass |
0.79 |
0.97 |
0.92 |
2.42 |
Shadows |
1.24 |
2.11 |
1.23 |
2.90 |
HZB |
0.39 |
0.20 |
0.17 |
0.22 |
SSAO |
0.29 |
0.26 |
0.26 |
0.26 |
Postprocessing |
0.34 |
0.31 |
0.34 |
0.32 |
Translucency |
0.14 |
0.19 |
0.19 |
0.20 |
GPU Scene Update |
0.00 |
1.90 |
1.76 |
1.88 |
Nanite |
— |
1.24 |
— |
2.52 |
[unaccounted] |
0.11 |
0.20 |
0.93 |
0.20 |
Triangles drawn |
1,434,587 |
38,282 |
38,428 |
1,681,518 |
-
В данной сцене
Prepass
неожиданно стал заметно быстрее в UE5, хотя в предыдущей сцене разницы не было. -
Также в этой сцене больше полигонов, что видно по цифрам без Nanite. А вот с ним число почти не изменилось, то есть здесь он делает свою работу лучше.
-
По остальным параметрам ситуация такая же, как и в предыдущей сцене.
Вид внутри «Скадовска»
UE4 |
UE5, |
UE5, |
UE5, |
|
Prepass |
0.56 |
0.09 |
0.10 |
0.08 |
Basepass |
0.44 |
0.43 |
0.36 |
0.25 |
Shadows |
1.14 |
1.81 |
1.24 |
2.87 |
HZB |
0.39 |
0.15 |
0.15 |
0.18 |
SSAO |
0.26 |
0.26 |
0.26 |
0.26 |
Postprocessing |
0.34 |
0.42 |
1.68 |
0.33 |
Translucency |
0.08 |
0.13 |
0.12 |
0.13 |
GPU Scene Update |
0.00 |
1.64 |
1.52 |
5.20 |
Nanite |
— |
1.21 |
— |
2.46 |
[unaccounted] |
0.01 |
0.54 |
0.38 |
0.11 |
Triangles drawn |
1,004,122 |
42,488 |
42,579 |
1,684,821 |
Данная сцена находится в помещении, что сильно влияет на цифры
-
Prepass,
неожиданно, почти ничего не стоит в UE5 во всех сценариях -
Basepass
иHZB
тоже работают лучше в UE5 -
Shadows
иTranslucency
по прежнему медленнее -
А
Postprocessing
вообще удивил. Почему полное отключение Nanite делает его таким медленным в данной сцене? -
GPU Scene Update
по-прежнему замедляет работу, а при использовании Nanite вообще ведёт себя ужасно -
Обратите внимание, что UE4 здесь рисует заметно меньше треугольников чем в предыдущих сценах, а UE5 во всех сценариях рисует больше. Подозреваю, что в UE5 сломалось вырезание объектов, которые полностью скрыты за другими.
Вид с опоры ЛЭП на почти всю карту
UE4 |
UE5, |
UE5, |
UE5, |
|
Prepass |
0.85 |
0.54 |
0.58 |
0.52 |
Basepass |
0.87 |
1.09 |
0.83 |
2.71 |
Shadows |
0.97 |
1.58 |
1.09 |
2.70 |
HZB |
0.52 |
0.33 |
0.29 |
0.37 |
SSAO |
0.27 |
0.26 |
0.28 |
0.26 |
Postprocessing |
0.33 |
0.30 |
0.32 |
0.31 |
Translucency |
0.10 |
0.13 |
0.13 |
0.15 |
GPU Scene Update |
0.00 |
1.91 |
2.21 |
1.94 |
Nanite |
— |
1.24 |
— |
2.81 |
[unaccounted] |
0.01 |
0.10 |
0.63 |
0.11 |
Triangles drawn |
1,464,696 |
39,090 |
38,833 |
1,682,196 |
Мы снова вернулись на открытое пространство. Цифры не сильно отличаются от «Вида с болот на Шевченко», поэтому добавить здесь нечего.
Вид с опоры ЛЭП на почти всю карту без прямого солнечного освещения
UE4 |
UE5, |
UE5, |
UE5, |
|
Prepass |
0.85 |
1.92 |
1.15 |
4.79 |
Basepass |
0.91 |
1.09 |
0.83 |
0.92 |
Shadows |
— |
— |
— |
— |
HZB |
0.67 |
0.35 |
0.30 |
0.34 |
SSAO |
0.28 |
0.27 |
0.29 |
0.26 |
Postprocessing |
0.34 |
0.33 |
0.40 |
0.33 |
Translucency |
0.10 |
0.14 |
0.13 |
0.15 |
GPU Scene Update |
0.00 |
1.25 |
1.20 |
1.31 |
Nanite |
— |
0.81 |
— |
2.47 |
[unaccounted] |
0.01 |
0.07 |
0.50 |
0.07 |
Triangles drawn |
1,067,320 |
139,303 |
139,141 |
1,681,544 |
А здесь я сменил солнечную погоду на облачную, поэтому теней здесь нет.
-
Prepass
внезапно стал тяжелее, чем при наличии солнца -
Солнца нет, соответственно
Shadows
ничего не делает -
GPU Scene Update
иNanite
стали заметно дешевле -
Число треугольников в UE4 заметно упало, а в UE5 с Nanite не изменилось. Без Nanite же число выросло в 10 раз, но там статистика поломана, поэтому на них не смотрим.
Вид с опоры ЛЭП на почти всю карту при сильном ливне (нет солнца и очень много полупрочзачного дождя)
UE4 |
UE5, |
UE5, |
UE5, |
|
Prepass |
0.89 |
2.03 |
1.14 |
4.34 |
Basepass |
0.93 |
1.18 |
0.88 |
1.10 |
Shadows |
— |
— |
— |
— |
HZB |
1.03 |
0.39 |
0.30 |
0.37 |
SSAO |
0.28 |
0.26 |
0.28 |
0.27 |
Postprocessing |
0.30 |
0.34 |
0.39 |
0.30 |
Translucency |
8.59 |
7.12 |
8.15 |
7.46 |
GPU Scene Update |
0.00 |
3.00 |
2.24 |
3.67 |
Nanite |
— |
1.43 |
— |
3.30 |
[unaccounted] |
0.03 |
0.13 |
0.53 |
0.14 |
Triangles drawn |
1,115,490 |
140,500 |
139,404 |
1,796,389 |
А в данной сцене ну оооочень много полупрозрачных частиц дождя. Важно отметить, что здесь UE5 оказался наиболее близок по производительности к UE4
-
Prepass
в UE5 опять хулиганит, причём особенно сильно при включенном Nanite. -
Basepass
отнимает больше времени при включённом Nanite по сравнению с UE4, но меньше при выключенном. -
А вот
HZB
работает сильно лучше в UE5 по сравнению с предшественником -
Translucency
тоже лучше в UE5 -
А вот
GPU Scene Update
стал отнимать ещё больше времени -
Nanite
тоже стал медленнее -
Число треугольников увеличилось во всех сценариях. Причём на UE4 оно всё ещё меньше чем в солнечную погоду, а вот в UE5 оно заметно больше
Вывод
-
Не переносите старого сталкера на UE5, переносите на UE4 -
Текущая альфа UE5 плохо показывает себя в низкополигональных сценах, что в больших и открытых, что в маленьких закрытых. Производительность падает в среднем до 50% от UE4 в одинаковых условиях.
-
Можно отключить Nanite совсем через команду
r.Nanite 0
в консоли, но производительность всё ещё будет хуже — 75% от UE4. Однако, если отключить солнечный свет, то будет около 87% от UE4. -
Если же убрать HLOD, включить Nanite и активировать его для всех непрозрачных мешей, то производительность упадёт ещё ниже — аж целых 35% от UE4! Частично причина в том, что HLOD упрощает не только модели, но и материалы, а Nanite нет (вроде бы). То есть теперь просчёт пикселей занимает больше времени. Но там явно виновато что-то ещё, и я не знаю что…
-
Если добавить в сцену множество полупрозрачных частиц (дождь), то производительность упадёт везде и очень сильно, но отставание UE5 уменьшится — 80/87/49 процентов от UE4. Это говорит о том, что пиксельные шейдеры в UE5 не трогали, а трогали только вершинные.
-
Собственно, главный вывод — не стоит делать низкополигональные игры на текущей альфе UE5. Надеюсь, это починят в будущем.
Бонус
UE4 уделывает и оригинальный движок сталкера X-Ray по производительности.
К примеру, вид с опоры ЛЭП скачет между 95 и 115 fps в Зове Припяти, в то время как UE4 выдаёт 230 fps. А если уткнуться в землю, то будет ровно 125 fps, то есть X-Ray ограничивает максимальную частоту кадров.
Можно сравнить и с модом Anomaly, который работает на современной фанаской версии X-Ray. Там fps болтается в районе 100, а разглядывание земли поднимает до максимально возможных 500. Картинка при этом сильно красивее, так что фанаты постарались на славу.