UDN
Search public documentation:

MobileGPUProfilingKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 홈 > 모바일 홈 > 모바일 GPU 프로파일링

모바일 GPU 프로파일링


문서 변경내역: Martin Mittring 작성. Daniel Wright, Jeff Wilson 수정. 홍성진 번역.

개요


(커서를 올리면 다른 상태가 나타납니다.)

ProfileEx1.jpg

모바일 하드웨어에서의 렌더링 퍼포먼스는 다른 플랫폼에 비해 처절합니다. 배터리에다 낮은 발열량으로 실행해야 하는 조건때문에 메모리 대역폭이나 CPU / GPU 연산 능력에 있어 제약이 엄격할 수밖에 없습니다. 산넘어 산이라고, 괜찮은 프로파일링 툴도 드문 데다가 하드웨어 사양도 천차만별입니다. 같은 기종일지라도 사용중인 OS 버전에 따라 사용할 수 있는 기능에 영향을 끼칠 수 있습니다. 이러한 악조건을 조금이나마 개선하고자, 퍼포먼스 프로파일링과 문제 해결을 위한 일반적인 해결책이 되는 단순한 메커니즘을 제공해 드리도록 하겠습니다.

모바일 디바이스에서 GPU 시간 측정하기


모바일 디바이스는 타임스탬프 퀴리를 지원하지 않습니다. 타임스탬프 퀴리란 다른 플랫폼에서, 전체 프레임이나 한 기능의 GPU 시간 비용을 측정할 때 쓰입니다. 예를 들어 'profilegpu' 는 D3D9 / D3D11 각기 다른 부분의 프레임에 대한 GPU 시간을, 'stat unit' 는 프레임 GPU 시간을 나타내는 명령입니다. 그 결과 사용할 수 있는 유일한 측정 수단은 총 프레임 시간입니다. 현재 CPU(게임 스레드와 렌더링 스레드)는 GPU 와 병행 실행되므로 프레임 시간은 둘 중 더 큰 것이 됩니다. 즉 총 프레임 시간을 사용하여 프레임 GPU 시간을 측정하려면, 현재 프레임이 GPU 에 제한된 상태여야 한다는 것입니다. 이는 'stat unit' 을 보면 확인할 수 있습니다. 프레임 시간이 'Game' 이나 'Draw' 시간보다 크다면, GPU 에 제한된 상태입니다. 기능을 여럿 끌 때는 프레임이 CPU 의 제약을 받아 측정치가 잘못 나오게 되니, 주의하시기 바랍니다. 위의 스크린샷에서 볼 때, Frame 시간은 Draw 시간보다 겨우 2 ms 클 뿐이라서, GPU 기능을 끄면 바로 CPU 의 제약을 받게 됩니다.

ProfileEx 로 일부 렌더링 기능의 퍼포먼스 영향 측정하기


별다른 방법이 없을 때 특정 렌더링 기능을 프로파일링해 볼 수 있는 초간단 방법입니다 ("Ex" 는 실험을 뜻하는 experiment 의 앞 두글자 입니다). 프로파일링하려는 기능의 마스크를 지정한 다음 5 초마다 그 기능을 토글합니다. 프레임 시간을 보면 해당 기능이 그 프레임에 얼마나 영향을 끼치는지 확인할 수 있습니다. 프레임율이 크게 출렁인다면 이 방법은 그리 좋지 않습니다. 안정적인 프레임율을 얻으려면 게임을 일시정지 상태로 조금 놔둬 본다든가, 별다른 움직임이 없는 씬을 구성해 두는 것이 좋습니다.

프레임 시간은 자동으로 표시(되며, 초당 한 번씩 그리 부드럽지는 않게 업데이트됩)니다.

기능을 켜려면 콘솔 변수 "ProfileEx" 를 설정합니다.

콘솔을 통해 확인할 수 있는 최신 도움말입니다:

  ProfileEx ?
          Profile Experiment: 특정 기능을 껐다 켜면서 stat unit 을 확인하는 기능 프로파일링 실험 기법입니다.
          별다른 프로파일링 방법이 지원되지 않는 플랫폼에서 유용합니다.
          가급적 VSYNC 는 꺼 두시고, "일시정지" 상태가 이상적입니다.
          "Stat unit", "StableFrameTime" 이 기능과 함께 활성화됩니다.
          FeatureMask 16진수 (더하여 합치고, 0 은 끕니다. 예: 0x1a = 0x10 0x08 0x02):
           0x001: 디퍼드 섀도우 투영
           0x002: 뎁스 오브 필드
           0x004: 블룸
           0x008: 그림자 (섀도우 맵 생성과 투영)
           0x010: 깊이 해석 (모바일 전용)
           0x020: 블룸/DOF 블러 (모바일 전용)
           0x040: 가우시안 블러 최대 4 샘플로 강제
           0x080: 포그 (모바일 전용)
           0x100: 반투명
           0x200: 스켈레탈 메시
           0x400: 스태틱 메시
           0x800: 파티클 (렌더링만 토글)
  

용례:

  ProfileEx 0x100
          반투명 프로파일링
  

  ProfileEx 0x500
          반투명과 스태틱 메시 프로파일링
  

코드에서는 이렇게 간단한 C++ 코드로 비트를 테스트할 수 있습니다:

  if(!GetProfileExState(0x2, View.Family->CurrentRealTime))
  {
      // 기능을 끈 채로 프로파일링
      OutSettings.bEnableDOF = FALSE;
  }
  

이 기능은 FINAL_RELEASE 에서는 사용할 수 없습니다.

특정 플랫폼용 글로벌 세팅 기능 조절법


ini 파일에는 (BaseEngine.ini 의 [SystemSettings] 같은 곳에) 세팅이 여러가지 있으며, 이는 플랫폼별로 ([SystemSettingsMobile] 나 [SystemSettingsIPad] 같은데서) 덮어쓸 수 있습니다. 예를 들면:

  MobileFog=True
  MobileHeightFog=False
  MobileSpecular=True
  MobileBumpOffset=True
  MobileNormalMapping=True
  MobileEnvMapping=True
  MobileRimLighting=True
  MobileColorBlending=True
  MobileColorGrading=False
  MobileVertexMovement=True
  MobileOcclusionQueries=False
  ; 0 은 선명화(sharpening) 없음. -0.5 면 텍스처가 선명해 지나 렌더링이 약간 느려지며 일렁임이 심해집니다.
  MobileLODBias=-0.5
  

최근 도입한, 조금 더 실험적인 세팅입니다:

  MobileSceneDepthResolveForShadows= TRUE
  

깊이 버퍼 해석 단계를 생략하면 퍼포먼스 상에 꽤나 큰 이득이 발생합니다. 그러면 깊이 버퍼를 예전 프레임에서 얻어오기 때문에 약간의 부작용이 생길 수는 있습니다만, 특정 (카메라 이동이 거의 없고 그림자를 받는 부분이 거의 평지인, 2D 같은 3D) 게임에서는 괜찮을 수 있습니다.