ContentCooking

  • 위 문서에서 정의한 ContentCooking은 다음과 같다.
    • Cooker의 주 역할은 Console 또는 PC 에서의 로드를 위한 최적의 형식으로 패키지를 저장하는 것. 패키지 처리에는 다음과 같은 일들을 수행한다.
      • 에디터 전용 데이터처럼 불필요한 데이터 제거하기(파일 크기에 큰 영향이 있음)
      • Byte swap에 따른 CPU overload 없이 Big-Endian 아키텍쳐에서 로드할 수 있도록 모든 데이터의 byte swap.
      • Resouce를 native 형식으로 저장하고, Console에서의 추가적인 처리 없이 직접 load할 수 있도록 처리함.
      • SeekTime이 느린 media(DVD…)에서의 load를 최적화하기 위해 SeekFree 자체 포함 package 생성.

관련 소스 파일

  • \Development\Src\UnreadEd\Src\UnContentCookers.cpp
  • 이 녀석을 시작으로 stack tracing 해 보면 실제 내용을 파악할 수 있을 듯 싶다.

Cooking 하기 전 주의사항

  • Cooking 대상이 되는 컨텐츠/ini/스크립트 파일들의 Read-only가 해제되어 있어야 함.
    • 그렇지 않으면, Cooking 과정에서 GetLastError=5(ERROR_ACCESS_DENIED)가 발생함.
    • 정확~하게 어떤 종류의 파일에서 발생하는지는 아직 모르겠음.
    • 주로 ShaderCache 파일들이 그 대상이 아닐까 추측됨. (테스트 해보고 문서 수정하겠3)
  • 한 번 Cooking했던 데이터가 이미 있다면, 가급적 다시 Cooking하기 전 해당 디렉토리를 깨끗하게 비우자.

관련 ini 설정

  • 우선 Cooking 관련 항목들은 XXXEngine.ini에 작성된다.
  • 따라서, DefaultEngine.ini 파일을 수정하면 된다.
  • CookedContent directory 설정
[Core.System]
SeekFreePCPaths=..\..\UTGame\CookedPC
SeekFreePCExtensions=xxx    // 이 녀석은 PC의 경우엔 관계없다. Console의 cooked packages의 확장자명으로 사용됨.
  • AlwaysCook Package 설정
    • ContentCooking시 빠지지 말아야 할 패키지들을 지정해두면 된다.
    • 주로 초기 화면을 구성하는 레벨 패키지가 지정된다.
    • “Package= “는 반드시 map이 지정되어야 한다.
    • Cooking되길 희망하는 user created map을 지정해줘도 된다.
[Engine.PackagesToAlwaysCook]
+Package=EnvyEntry
+Package=UTFrontEnd
+Package=ExteelFrontEnd
+Package=MM-TrapFactory_Edit_3    // 내가 추가한 map
  • Startup Packages
    • 초기 부트 중 오브젝트가 필요하거나 반드시 메모리에 있어야 할 패키지 지정.
    • 예를 들어, ExteelFrontEnd 맵에서 IntroScene을 표시할 때 Exteel2_UI 패키지가 필요하다.
    • 이 때 아래 두 가지 작업이 필요하다.
      • IntroScene은 부팅 초기에 필요한 패키지이므로 StartupPackages에 포함되어야 한다.
      • ExteelFrontEnd 맵에 반드시 필요한 패키지이므로 PackagesToForceCookPerMap에 반드시 map-package로 지정되어야 한다.
      • 이 작업을 거치지 않은 채 cooking 하면 ExteelFrontEnd 맵에서 아무 UI가 작동하지 않게 된다.
+Package=FX_HitEffects
+Package=UI_Fonts
+Package=UI_Fonts_Final
+Package=Exteel2_UI    // 이 패키지를 startup 패키지로 지정.
  • 특정 Map에 Cooking할 Package 설정
    • 먼저 Map을 지정하고, 그 뒤에 cooking될 package를 추가하는 방식으로 작성한다.
    • ExteelFrontEnd의 경우 Exteel2_UI 패키지가 필수적이므로 추가해 주어야 한다.
[Engine.PackagesToForceCookPerMap]
.Map=UTFrontEnd    // 먼저 map 지정
.Map=ExteelFrontEnd
.Package=UI_Scenes_Mutators    // 그 뒤에 cooking될 package 지정
.Package=UI_FrontEnd_Art
...
...
.Package=UI_Skins
+Package=Exteel2_UI    // for ExteelFrontEnd

ContentCooking comandline argument 설정

  • UDN에는 FrontEnd 툴을 이용한 방법도 소개되어 있지만, 우선 커맨드라인으로 다음과 같이 작성한다.
  • 다른 argument 설정과 마찬가지로 실행 파일명 뒤에 다음 arguments들을 붙여준다.
  • CookPages -platform=PC -full -languageforcooking=INT -cookallmaps
    • 위 argument들 외 다른 셋팅으로도 cooking이 가능하니, UDN 링크의 argument 설명을 반드시 참고!

Cooked Content로 실행하기

  • UDN에 따르면, PC 버전은 Uncooked / Cooked / Mixed 형태로 바이너리 실행이 가능하다고 한다.
  • Cooked Content로 바이너리를 실행하고 싶다면, 실행시 다음 argument를 뒤에 붙여주면 된다.
    • -seekfreeloading

간략한 테스트 결과

  • 테스트 환경
    • i5-750 (2.67GHz) + 3.2GB RAM + Geforce 9800GT
    • UnCooked
      • 클라이언트 로딩 1분 50초 + TrapFactory_Edit3.udk 로딩 26초 ⇒ 2분 16초
    • Cooked
      • 모두 포함하여 8.7초 소요됨.
  • 오우 엄청난 시간 차이가 발생한다.