Предзагрузка ресурсов в CRYENGINE 5. GameRules Precache.
Официальная документация: http://docs.cryengine.com/display/SDKDOC4/GameRules+Precache
В упрощённом представлении есть два типа загрузки ресурсов уровня:
1) при показе экрана загрузки, во время которого загружаются файлы самого уровня и файлы из списка предзагрузки;
2) во время игрового процесса по мере востребованности ресурсов в кадре.
Основная задача предзагрузки ресурсов заключается в оптимизации «прогрузок» во время игрового процесса, которые могут привести к неприятным подтормаживаниям и временной мутности текстур (особенно при старте игрового процесса сразу после загрузки уровня).
Во время предзагрузки часть ресурсов будет загружаться с жёсткого диска в оперативную память при показе экрана загрузки, что решает проблему, показанную на картинке выше: текстуры пытаются загрузиться с последнего mip-уровня, а модели с последнего LOD, чтобы снизить подтормаживания при чтении с жёсткого диска. Цена этому более длительное созерцания экрана загрузки и несколько большее потребление оперативной памяти. В CRYENGINE 5 предзагрузка ресурсов реализована посредством GameRules Precache.
GameRules Precache — это специальная централизованная подсистема предзагрузки желаемого контента игры с жёсткого диска в оперативную память.
GameRules Precache использует специальный список ресурсов для предзагрузки, который называется PrecacheLists.xml. В GameSDK его можно найти в Scripts.pak\Scripts\GameRules\.
Все описанные в Scripts\GameRules\PrecacheLists.xml ресурсы начинают предзагружаться при старте загрузки уровня (когда показывается экран загрузки).
Примечание: Код по чтению PrecacheLists.xml и старту предзагрузки находится в GameRulesPrecache.cpp.
Пример части содержимого PrecacheLists.xml:
Примечание: Для редактирования PrecacheLists.xml рекомендую использовать Notepad++ или любой другой аналог с подсветкой синтаксиса.
Условия предзагрузки и выгрузки.
На выбор есть ряд условий, когда и какие ресурсы будут предзагружаться, а когда условия не выполняются — выгружаться.
1. GameMode. По умолчанию их два: SinglePlayer и Miltiplayer.
<GameMode name='SinglePlayer'>
<FlashTexs>
<FlashTex name ='objects/thecursedforest/sweet_bear/sweet_bear_diff.dds' />
<FlashTex name ='objects/thecursedforest/sweet_bear/sweet_bear_ddna.dds' />
</FlashTexs>
</GameMode>
2. Для конкретного уровня. Просто указываем название уровня и что для него подгрузить.
Пример:
<Level name='main_menu'>
<CGFs>
<CGF name ='objects/TheCursedForest/Natural/trees/oaks/oak_normal/oak_2.cgf' /
</CGFs>
</Level>
3. Always — загружать всегда. Указанные ресурсы будут предзагружаться при старте игры и оставаться в оперативной памяти до выключения игры. Это может быть полезно для ресурсов, которые очень часто используются на уровнях игры.
Пример:
<Always>
<GFXs>
<GFX name ='/libs/ui/tcf_main_menu.swf' />
<GFX name ='/libs/ui/tcf_HUD.swf' />
</GFXs>
</Always>
Примечание: Можно использовать все условия сразу.
Типы файлов для предзагрузки.
DBAs |
Animation Database Files. |
ADBs |
Mannequin Database Files. |
CDFs |
Character Definition Files. |
CGFs |
Файлы статичной геометрии. |
CGAs |
Файлы анимированной геометрии. |
CHRs |
Файлы скелетов персонажей. |
Particles |
Полное название конкретного партикла. Пример: Explosions.grenade_air.explosion |
VehicleXMLs |
Vehicle XML Files. |
FlashTexs |
Любые текстуры в формате .dds. |
Ammos |
Ammo XML Files. |
Weapons |
Weapon XML files. |
BodyDamages |
BodyDamage и/или BodyDestruction XML files. |
GFXs |
Flash-файлы в формате .swf или .gfx. Путь для этих файлов должен обязательно начинаться с /libs. |
MTLs |
Файлы материалов. |
Пример PrecacheLists.xml.
Краткий пример PrecacheLists.xml с использованием всего выше описанного:
<PrecacheLists>
<Always>
<FlashTexs>
<FlashTex name ='objects/thecursedforest/natural/grass/grass_2/grass_2_diff.dds' />
</FlashTexs>
<GFXs>
<GFX name ='/libs/ui/tcf_main_menu.swf' />
</GFXs>
</Always>
<GameMode name='Multiplayer'>
<CDFs>
<CDF name='Objects/characters/human/sdk_player/sdk_player.cdf' />
</CDFs>
<DBAs>
<DBA name='animations/human/male/locomotion.dba' />
</DBAs>
<CGFs>
<CGF name ='objects/TheCursedForest/Natural/trees/oaks/oak_normal/oak_2.cgf'
</CGFs>
<Particles>
<Particle name='Explosions.grenade_air.explosion' />
</Particles>
<VehicleXMLs>
<VehicleXML name='Scripts/Entities/Vehicles/Implementations/Xml/HMMWV.xml'/>
</VehicleXMLs>
<FlashTexs>
<FlashTex name ='objects/thecursedforest/sweet_bear/sweet_bear_diff.dds' />
<FlashTex name ='objects/thecursedforest/sweet_bear/sweet_bear_ddna.dds' />
</FlashTexs>
<Ammos>
<Ammo name="PistolBullet" />
</Ammos>
<BodyDamages>
<BodyDamage body="Libs/BodyDamage/BodyDamage_MP.xml" parts="Libs/BodyDamage/BodyParts_HumanMaleShared.xml" />
<BodyDestruction name="Libs/BodyDamage/BodyDestructibility_Default.xml" />
</BodyDamages>
<ADBs>
<ADB name='Animations/Mannequin/ADB/humanSlaveAnims3P.adb'/>
</ADBs>
</GameMode>
<GameMode name='SinglePlayer'>
<CGFs>
<CGF name ='objects/TheCursedForest/Natural/Rocks/ground_rock_04.cgf' />
</CGFs>
<FlashTexs>
<FlashTex name ='textures/TheCursedForest/decals/drawings/chalk/bear_1.dds' />
</FlashTexs>
<GFXs>
<GFX name ='/libs/ui/tcf_HUD.swf' />
</GFXs>
</GameMode>
<Level name='mainmenu'>
<FlashTexs>
<FlashTex name ='objects/TheCursedForest/props/rune_pillar_1/rune_pillar_1_diff.dds' />
</FlashTexs>
</Level>
</PrecacheLists>
Таким образом при желании можно предзагрузить все ресурсы уровня, но ценой долгой загрузки с показом экрана загрузки.