[Гайд] Оптимизируем перформанс в Смуте

UPD: Поднимаем FPS с 26 до 38 без сильно заметного ухудшения качества графики* (точный прирост зависит от железа).

Введение

Итак, занявшись харкорным профилированием Смуты через PIX for Windows и Nvidia Nsights Graphics, нашел пару интересных мест влияющих на производительность.

Статья с подробным исследованием проблем производительности в процессе, но сейчас я бы хотел поделиться парой советов по оптимизации перформанса через конфиги игры.

На моем железе (ноут с RTX 2060 6 GB, AMD Ryzen 7 4800H и 16 GB RAM) на рынке в Нижнем Новгороде (первая локация после пролога) на высоких настройках фпс увеличивается с 26 до 38 [UPDATED].

Кажется, что немного, но на самом деле это 31%. В миллисекундах это 12,15 ms (с 38,46 ms до 26,31 ms).

Было:

26 фпс
26 фпс

Стало:

38 фпс
38 фпс

В чем суть изменений

  1. Выключен рейтрейсинг (r.RayTracing=False). Все равно не используется т.к. для Lumen включенный софтварный рейтрейсинг (r.Lumen.HardwareRayTracing=False). Он же требует включенным GPU Skin Cache (см. следующий пункт)
  2. Выключен GPU Skin Cache для SkeletalMeshes (в основном относится к персонажам). Потому что очень медленный из-за того, что использует CPU visible память через шину PCI (параметр r.SkinCache.Mode=1).
  3. При включенном DLSS можно отключить встроенный TSR (Temporal Super Resolution) который съедает производительность при не таком большом улучшении качества сглаживания. (параметр r.AntiAliasingMethod=4).
  4. ⚠Выключено "ведьмачье чутье" (CustomDepth пасс, r.CustomDepth=0) ⚠. Это влияет на геймплей т.к. не будут подсвечиваться объекты и персонажи по кнопке Q. Но зато дает заметный прирост в производительности, ведь они рисуют в этом пассе много ненужного мусора.
  5. Hardware occlussion queries заменены на HZB Occlusion. (r.HZBOcclusion=2)
  6. Отключены тени от ландшафта (r.AllowLandscapeShadows=0)
  7. Тюнинг качества объемных облаков
  8. Отключен 4й каскад в Directional Light (r.Shadow.CSM.MaxCascades=3)
  9. Включен Occlusion culling для каждого инстанса в ISM (Instanced StaticMesh) и HISM (Hierarchical) (r.InstanceCulling.OcclusionCull=1)
  10. Включены некоторые оптимизации для RenderThread.

Как сделать

Находим файл C:\Users\<НАЗВАНИЕ ПОЛЬЗОВАТЕЛЯ>\AppData\Local\Smuta\Saved\Config\Windows\Engine.ini

и вставляем в конец вот этот блок [UPDATED]:

[/Script/Engine.RendererSettings] ; Ультимативный подход для тех кто хочет получить максимум фпс за счет потенциально мыльных текстур ; (если видеопамяти будет не хватать, движок будет использовать MIPы вместо того чтобы выгружать видеопамять в системную память) ;D3D12.AdjustTexturePoolSizeBasedOnBudget=1 r.RayTracing=False r.SkinCache.CompileShaders=False r.GPUSkin.Support16BitBoneIndex=False r.GPUSkin.UnlimitedBoneInfluences=False r.AntiAliasingMethod=2 r.SkinCache.Mode=0 r.SkinCache.DefaultBehavior=0 r.SupportReversedIndexBuffers=False r.SupportDepthOnlyIndexBuffers=False r.VirtualTexturedLightmaps=False r.OcclusionCullParallelPrimFetch=True r.UseParallelGetDynamicMeshElementsTasks=1 ; Это изменение отключает подсветку персонажей или объектов в "ведьмачьем чутье" (кнопка Q) ; Но зато дает заметный прирост в производительности, ведь они рисуют в этом пассе много ненужного мусора. r.CustomDepth=0 r.HZBOcclusion=2 bSmoothFrameRate=False r.LandscapeLOD0DistributionScale=4 r.LandscapeLODDistributionScale=2 r.AllowLandscapeShadows=0 r.FreeSkeletalMeshBuffers=1 ; Если совсем не нужны объемные облака - можно их отключить и получить прирост перформанса ;r.VolumetricCloud=0 ; Тюнинг качества облаков - они нигде не перезаписываются в Scalability даже в исходной версии движка r.VolumetricCloud.ViewRaySampleMaxCount=256 r.VolumetricCloud.ShadowMap.RaySampleMaxCount=96 r.VolumetricCloud.SampleMinCount=2 r.VolumetricCloud.EmptySpaceSkipping=1 r.CapsuleShadows=0 r.VolumetricCloud.SkyAO.MaxResolution=256 ; Выключаем 4 каскад в Directional shadows. Там все равно Distance fields shadows отрабатывают, а разница не особо заметна r.Shadow.CSM.MaxCascades=3 r.Shadow.MaxNumFarShadowCascades=0 r.Shadow.FarShadowDistanceOverride=0 ;r.DFDistanceScale=1 r.InstanceCulling.OcclusionCull=1 ; Все равно не используется, но буферы аллоцирует r.Nanite=0 ; Буфер наполовину пустой поэтому можно его срезать с 4096 ; Может повлиять на качество освещения в некоторых сценах. ; Поэтому выключил по дефолту. Тем у кого машина слабая имеет с смысл раскомментить ;r.LumenScene.SurfaceCache.AtlasSize=2048

Вот собственно и все, можно запускать игру и проверять перформанс.

P.S.

Интересно было бы получить фидбек насколько это повлияет на фпс у других людей (если вообще найдутся желающие применить эту оптимизацию).

2727
74 комментария

Вот людям делать нечего. Копаются в говне, да ещё и рады)

12

Профессиональный интерес

7

Через 20 лет эта игра станет культовой. А сейчас ее просто никто не понял.

5

Комментарий недоступен

8

@А что такое
На самом деле было бы очень круто прочитать статью про то, в чем именно в основном заключаются проблемы производительности "Смуты" говоря и техническим, и обычным языком. Редко кто действительно технически обозревает игры (в общем потому что это сложно), те же Digital Foundry не лезут к примеру в RenderDoc, вместо этого ограничиваясь лишь общими терминами объяснения графики/производительности. Поэтому такая статья (как по мне) на вес золота, тем более в рунете.
Кстати, правильно ли я понимаю, что даже релизный билд можно проанализировать к примеру с пом. Unreal Frontend для UE4 или Unreal Insights для UE5?
https://docs.unrealengine.com/4.27/en-US/TestingAndOptimization/PerformanceAndProfiling/Profiler/
https://dev.epicgames.com/documentation/en-us/unreal-engine/unreal-insights-in-unreal-engine

4

А Unreal Frontend/Insights не доступны в релизном билде(
По дефолту в релизном билде даже консоль и логи выключены на этапе компиляции. Так что без отдельных махинаций их не включить.

2