Предзагрузка ресурсов в CRYENGINE 5. GameRules Precache.

06. января 2018 CRYENGINE 5 0

Официальная документация: 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>

 

Таким образом при желании можно предзагрузить все ресурсы уровня, но ценой долгой загрузки с показом экрана загрузки.