ShaderCache?

  • 클라이언트나 에디터 실행시 프로그램 로드 속도를 올리기 위해 보유중인 Contents들의 shader를 compile 한 후에 이것을 저장해 두는 녀석이다.
  • 아래 페이지에서 개괄적인 내용을 볼 수 있으며…
    • 위 문서의 짤막한 내용 중 가장 중요한 것은 아래 문장이다.
      • “On PC, global shaders are always read from the local shader cache only, so deleting the local shader cache will force a recompile of all global shaders”
      • 즉, PC 플랫폼에서는 GlobalShader가 LocalShaderCache의 내용만 읽어들인다는 것이다.
      • 실제로 RefShaderCache를 모두 지우고 테스트 해 보았으나, 프로그램 구동에는 아무런 문제가 없었다.
      • 하지만, UDN에 따르면 이것은 구동에만 문제가 없는 것이지 바람직하진 않다고 한다. 과연???
  • RefShaderCacheLocalShaderCache에 대한 내용은 아래 페이지에 자세히 수록되어 있다.
    • 즉, RefShaderCache는 팀 단위 그룹에서의 ShaderCache의 Seed 역할을 한다고 생각하면 된다.
    • 다음 시나리오를 보면 이해가 쉬울 것이다.
      • DailyBuild 시스템이 갖추어진 머신에서 매일 RefShaderCache가 갱신되고 이것이 팀원들에게 분배된다.
      • RefShaderCache에 포함되지 않은, local machine의 유니크한 쉐이더들만 다시 LocalShaderCache로 컴파일되어 저장된다.
      • 즉, 각자의 머신에서 새로 컴파일되어야 할 녀석들이 최소화될 수 있다는 얘기다.
  • 하지만, 실제로 RefShaderCache 관련하여 테스트 해 본 결과는?
    • 위에서 정리한 내용은 UDN의 것을 바탕으로 한 정리이다.
    • 실제로 cmdlet을 이용하여 테스트 해 본 결과는 다음과 같다.
      • XXGame precompileheaders platform=xenon -refcache -unattend -skipmaps 로 수행을 해도
      • LocalShaderCache만 생성되지 RefShaderCache는 생성되지 않았다.
      • 읭?! 뭐지?!

ShaderCache & Bootup Time

  • 2011년 2월 4일 현재 내 개발망 PC의 간략한 spec은 다음과 같다.
    • Intel i5-750 @ 2.67GHz
    • 4GB RAM
    • Geforce 9800GT
  • 이 상황에서 ShaderCache가 제대로 되지 않을 때와 제대로 될 때의 Bootup time의 차이는 생각보다 크다.
    • ShaderCache가 제대로 되지 않을 때
      • 클라이언트 : 70~80 secs
      • 에디터 : 110~130 secs
    • ShaderCache가 제대로 동작할 때
      • 클라이언트 : 7~8 secs
      • 에디터 : 18~25 secs

ShaderCache가 제대로 되지 않았던 이유

  • 아주 간단한 두 가지 이유 때문이었다.
  • 첫번째, RefShaderCache가 오래되어 LocalShaderCache로 재컴파일되어야 할 것이 많았고,
  • 두번째, 컴파일된 쉐이더를 LocalShaderCache 파일에 저장을 해야 하는데, 이것이 퍼포스에 check-in 된 녀석이었다.
  • 따라서, read-only 상태였기 때문에 GetLastError=5(Access denied)가 발생했기 때문이다.
    • 즉, 이 파일은 writable 해야 한다.
  • 그렇지 않으면 매번 실행시마다 LocalShaderCache와 다른 부분에 대해 Shader compiling이 발생하기에, 그토록 실행시간이 길었던 것이다.

정리

  • 올바른 ShaderCache 사용을 위해 다음 두 가지를 잘 지키면 된다.
  • RefShaderCache는 daily build / distribute 되게 할 것.
  • LocalShaderCache는 언제나 writable 속성을 보장할 것.