UDN
Search public documentation:

PerformanceDebuggingKR
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

성능 디버깅

요약: Unreal Engine에서의 프레임 속도 문제와 힛치를 디버그하는 방법.

문서 변경 내역: 작성 및 유지 관리 Mike Fricker.

게임 성능 개요

다음 섹션들은 성능 문제, 병목 현상 그리고 힛치 등을 추적하는데 가장 도움이 되는 도구들에 대해 이해하는데 도움이 될 것입니다.

대개 가장 먼저 해야할 일은 프레임이 CPU 나 GPU 의 성능에 의해 제한되고 있는지 아닌지 판단한 다음, 적절한 도구를 사용해서 문제를 좁혀나가는 것입니다.

만일 CPU 가 느리게 작동되고 있다면, 이 문제를 해결하는데 사용할 수 있는 명령어와 디버깅 도구들이 많이 있습니다. 때로는 액터나 “움직이는 부분” 이 너무 많은 것이 프레임이 느려지는 원인이 됩니다. 또는 레니게이드 AI 클래스가 프레임당 수천 개의 화염을 발사하고 있을지도 모릅니다. 인내심을 약간 가지면 이러한 성능 문제들을 개별 레벨의 액터에까지 추적할 수 있습니다!

GPU 의 성능에 대해서는 draw 이벤트나 쉐이더 성능, 그리고 게임내 시각화 모드 및 HUD 통계의 분석을 위해 PIX 를 사용할 필요가 있을지 모릅니다. 때로 이들 문제들은 컨텐츠의 짜임새나 조명의 속성에까지 거슬러 올라갑니다.

어떤 경우이든, 지속 프레임의 속도 문제 또는 힛치 (프레임 시간의 대폭 변화) 에 대처하게 됩니다. 빈약한 지속 프레임 속도에 대해서는 단일 프레임 캡처 도구 (명령어 TRACE 등) 와 샘플링 프로파일러 (VTune 등) 가 매우 도움이 될 것입니다. 힛치에 대해서는 StatsViewer 도구의 호출 그래프를 사용하여 프레임의 내력을 분석할 수 있습니다.

상당수의 Unreal 도구들이 다중 플랫폼에서 작용하기는 하지만, 콘솔들은 PC 와는 별도의 성능 디버깅 도구들을 가지고 있습니다.

단계별 성능 디버깅

디버깅을 위한 준비:

  1. 먼저, 게임이 실행되는 동안에는 언제나 STAT UNIT 이 있도록 확실히 합니다.
  2. 빌드 환경 설정 을 설정합니다. 성능을 측정할 때는 ShippingDebugConsole (LTCG) 빌드를, 성능을 디버그할 때는 Release 빌드를 사용합니다.
  3. 로그 스팸, 또는 성능의 결과를 해치는 디버그 코드를 모두 중지했는지 확인합니다.
  4. Turn off 가비지 수집 확인 을 중지합니다. 이것이 힛치를 조장할 수 있기 때문입니다.
  5. 최종 릴리스 모드의 스크립트를 컴파일 합니다.
  6. VSync 를 무효화 하여 빠른 프레임에서도 병목현상을 식별할 수 있도록 합니다.

병목 현상 타입의 분리:

  • STAT UNIT 을 사용하여 프레임이 왜 느려지는지 판단합니다.
    • 문제가 CPU 때문인지 GPU 때문인지 구별할 수 있어야 합니다.

CPU - 느린 C++ 또는 UnrealScript 코드를 철저히 조사:

  • STAT SLOW 를 가동하면 CPU에서의 힛치를 식별하는데 도움이 됩니다.
    • STAT SLOW 를 사용할 때 ScriptTime 에서 힛치를 보게 되면, StatsViewer 또는 ScriptProfiling 을 사용해서 게임플레이 코드 내의 스크립트 타이밍 데이터를 파헤쳐 보십시오.
  • 플랫폼의 CPU 샘플링 도구들 을 사용해서 C++ 코드용의 프로파일링 데이터를 포착합니다.
  • StatsViewer 로 사용할 UnrealScript 호출 및 Stat 기반의 타이밍 데이터를 포착합니다.
    • 이것은 힛치와 스크립트 성능 버그를 추적하는데 아주 좋은 도구입니다!
  • ScriptProfiling 를 사용하여 UnrealScript 코드에서 핫스팟을 찾아냅니다.

GPU ? 빈약한 렌더링 성능의 원인 판단:

  • GPU 프로파일링 도구 를 사용하여 느린 draw 호출, 메모리를 많이 사용하는 쉐이더, 그리고 안좋은 자원 처리의 위치를 파악합니다.

전형적인 Unreal Engine 성능 문제의 해결을 위한 지침:

  • MoveActor 의 호출: (이 함수에서 호출한 함수를 실행하는데 소비된 시간이 포함된) 포함 시간에 MoveActor() 호출의 자원 사용이 많은 것으로 나타남.
  • 동적 조명 환경: 동적 조명 환경의 업데이트가 자원을 많이 사용하는 것으로 나타남.
  • SkeletalMeshComponent 업데이트: 포함 시간에 SkeletalMeshComponent::Tick 호출의 자원 사용이 많은 것으로 나타남.
  • LineChecks: SingleLineCheck/MultiLineCheck 에서 시간이 너무 소비됨.

레벨의 컨텐츠 및 자산이 최적화 되도록 함:

  • 성능 문제는 흔히 레벨이나 자산을 변경하거나 최적화 함으로써 해결될 필요가 있음.
  • 이용 가능한 도구에 대한 것은 컨텐츠 최적화 섹션 참조.

성능 참조

프레임/쓰레드/GPU 시간 (STAT UNIT) 표시

프레임 시간의 병목현상이 어디서 일어나는지 판단하려면 STAT UNIT 명령어를 사용합니다. STAT UNIT 은 프레임 시간, 게임 쓰레드 시간, 렌더 쓰레드 (Draw) 시간 및 GPU 시간 (가능한 경우) 을 표시하는 화면상의 HUD 를 토글합니다. 이것은 성능 문제를 추적하는 매우 귀중한 첫 단계입니다. 이를 항상 가동해 두는 것이 좋습니다.

또한 STAT FPS 명령어를 사용하여 화면에 프레임 비율과 프레임 시간을 표시합니다.

빌드 환경 설정

성능을 테스트하는 동안에는 ReleaseShippingDebugConsole (LTCG) 빌드 환경 설정을 사용합니다. ShippingDebugConsole 은 출하 타이틀에 가까운 성능의 수를 제공합니다. 그러나 어떤 성능 측정 및 디버깅 기능 (Stats 캡처 등) 은 이용할 수 없을지도 모릅니다. 결과를 상대적으로 보는 한, Release 빌드는 약간만 조정하면 성능 및 메모리의 테스트에 충분합니다.

Release 빌드로 테스트하고자 한다면, 관계없는 로깅을 모두 중지시켜야 합니다. 로깅을 중지하려면 이를 명령어를 이용해서 억제하거나 컴파일 때에 이를 #ifdef 으로 처리합니다. 예를 들면, "suppress AILog" 은 C++ 와 스크립트의 함수가 느려지게 하는 게임 특정 AI 의 로깅을 중지시킵니다.

가비지 수집 확인 중지

성능 작업을 하는 동안에는 항상 GC Verification 이 중지되어야 합니다. 그렇지 않으면 Release 빌드에 적어도 30초마다 커다란 힛치이 생깁니다. 가비지 수집 확인의 중지는 다음 중 한 가지 방법으로 할 수 있습니다:

  • UnObjGC.cpp 에서, VERIFY_DISREGARD_GC_ASSUMPTIONS0 인지 확인합니다.
  • 명령 행 인수 -NoVerifyGC 를 전달합니다.

최종 릴리스 모드에서의 스크립트 컴파일

UnrealScript 의 성능은 logging (로깅) 과 assertion (주장) 이 유효화되면 크게 달라집니다. 출하 타이틀에 가까운 성능을 얻는 가장 쉬운 방법은, 스크립트를 Final Release 모드로 컴파일하는 것입니다. 이 모드는 비싸게 먹히는 이러한 호출들을 컴파일된 바이트 코드에서 자동적으로 떼어내 버립니다. Final Release 스크립트는 다음 중 한 가지 방법으로 구축됩니다:

  • Unreal Frontend 에서, Cooking 탭을 선택하여 "Cook Final Release Scripts" 체크박스를 유효화 합니다. 이제 쿠커를 실행하거나 UFE 를 통해 게임을 가동하면 Final Release 스크립트가 컴파일되어 사용될 것입니다.
  • 명령 행 매개변수 -Final_Releasemake 커멘드렛으로 전달합니다.

VSync 의 무효화

최선의 결과를 위해서 VSync 를 무효화 합니다 (프레임을 표시하기 전에 수직 회귀를 기다림). 그렇지 않으면 프레임 시간이 게임의 새로 고침 속도에 덧붙여져 정확한 결과를 얻는 것이 더 어려워집니다. 다음은 VSync 를 중지시키는 방법입니다:

  • 명령 행 옵션 -NoVSync 을 게임에 전달합니다.
  • 아니면, Unreal FrontendGame 탭에서 "No VSync" 체크박스를 유효화 합니다.

STAT SLOW 의 사용

STAT SLOW 명령어는 성능 상승을 발견하는데 도움이 됩니다. 이는 프레임에서 지정 시간 (기본은 10 ms) 보다 오래 실행되는 사이클 Stat 을 보고함으로써 힛치를 줄이는데 도움이 됩니다. 느리게 실행되는 Stat 은 잠깐동안 HUD 에 표시되어 상승을 화면상의 게임 행동과 서로 관련짓기가 더 쉬워집니다.

이것을 사용하려면 콘솔에서 STAT SLOW 를 선택적 인수들과 함께 입력합니다. 인수들은 초로 나타낸 분계점 (10 ms는 0.01초) 과 한 번 스파이크하면 Stat 을 얼마동안 렌더할 것인지 (기본값은 10초) 를 나타냅니다.

예: STAT SLOW 0.01 10

이는 지난 10초 동안에 10 ms 이상인 사이클 Stat 을 모두 렌더합니다.

CPU 프로파일링

프레임 병목현상을 CPU 성능으로서 분리한 후, 처리할 다음 단계 중 하나는 C++ 코드의 어느 곳에서 시간이 소비되었는지 알아내는 것입니다. 그밖에, Load-Hit-Stores 또는 캐시의 누락 등 숨겨진 성능의 비용을 찾아볼 수도 있습니다.

대부분의 플랫폼은 상세한 코드 메트릭스와 심지어는 라이브 세션에서 포착한 데이터를 사용하는 C++ 코드의 호출 그래프를 제공하는 강력한 CPU 샘플링 도구를 가지고 있습니다. 예를 들어, Windows 플랫폼에서는 짧은 시간 동안에 핫스팟을 분리하기 위한 샘플링 데이터를 포착하기 위해 Intel VTune 을 사용할 수 있습니다. 콘솔 플랫폼에도 비슷한 도구가 있으며, 흔히 개발 도구 체인에 포함됩니다.

이러한 응용 프로그램에 익숙해져서 개발 과정에서 폭넓게 이용하는 것이 좋습니다!

일부 콘솔에는 단일 프레임 CPU/GPU 샘플링 캡처의 수행을 돕는 Unreal 의 유틸리티 기능이 있습니다. TRACE GAME 를 타이프하여 CPU 추적을 시작하거나, TRACE RENDER 를 타이프하여 GPU 데이터를 포착할 수 있습니다.

대부분의 CPU 프로파일러는 샘플링 데이터의 포착 그리고/또는 단기간의 호출 그래프 데이터를 지원합니다. 이는 빈약한 지속 프레임 속도와 관계있는 성능 문제를 디버깅 하는데 매우 유용합니다. Sampling captures 는 대개 함수가 C++ 코드로 핫스팟을 호출하도록 해줍니다. 그러나 Call Graph capture 가 훨씬 도움이 된다는 사실을 종종 발견하게 될 것입니다!

호출 그래프 에는 흔히 더 많은 캡처 시간 경비가 소요되지만, 핫스팟 함수의 호출자 에 대해 상세한 정보를 제공하여 곧바로 문제의 원인을 찾을 수 있도록 합니다! 여러 객체/액터들이 실행속도가 느린 하나의 함수를 호출하는 경우에도, 운이 좋으면 호출 그래프는 특정 액터 클래스의 이름 또는 원인을 짐작할 수 있는 다른 패턴으로 인도합니다.

때로 호출 그래프는 단순히 시간을 잡아먹는 UnrealScript (ProcessEvent, CallFunction 등의 호출) 를 보여줍니다. 이 경우에는 StatsViewer 또는 ScriptProfiling 캡처를 실행하여 그 호출들을 밝혀낼 수 있습니다.

프레임의 힛치 를 취급할 때, CPU 프로파일러는 가끔 상대적으로 낮은 샘플링 빈도로 인해 다루기 힘들어질 때가 있습니다. 만일 힛치가 게임에서 쉽사리 재현될 수 있는 것이라면, CPU 프로파일링 세션을 캡처하는 동안 그 힛치를 가능한 한 자주 (프레임당 여러 번이 바람직함) 일으키는 것이 좋은 방법입니다. 힛치가 정의하기 어려운 것이라면, 캡처 데이터를 StatsViewer 에서 사용하도록 하여, 여려 개의 프레임에 호출 그래프의 이력을 제공하도록 합니다.

StatsViewer 를 사용하는 코드 프로파일링

StatsViewer 를 사용하여 CPU 성능 문제를 철저히 조사할 수 있습니다. 이는 또한 UnrealScript 코드를 위한 자세한 프로파일링 도구로서의 역할도 합니다!

StatsViewer 는 모든 UnrealScript 의 함수 호출들게임 stats (값 계수기, 사이클 타이머 등) 를 PIX 에서와 비슷한 방식으로 데이터를 정렬하고 볼 수 있는 일정 그래프와 함께 표시합니다. 보다 중요한 것은 이것이 유효범위가 한정된 사이클 stat 및 스크립트 함수의 훌륭한 계층적 호출 그래프 를 나타낸다는 점입니다. 이는 주어진 프레임에 대해 “무엇이 느린지” 빠르게 알 수 있도록 합니다 (그래프 창에서 프레임을 더블 클릭하기만 하면 됩니다).

준비:

  • 현재 사용하고 있는 빌드 (UnBuild.h) 에 STATS1 로 정의되도록 합니다.
    • Debug 및 Release 빌드에서는 이것이 유효로 기본 설정되어 있습니다.
  • 스크립트 코드를 프로파일 하려면, 또한 STATS_SLOW1 로 정의되도록 합니다 (UnStats.h).
    • 이는 프로파일링이 느려지게 하지만, 모든 UnrealScript 호출에 대한 자세한 호출 그래프 데이터를 제공합니다.

Stat 데이터를 디스크에 캡처하려면 (권장):

  • 콘솔에 "STAT StartFile" 을 타이프하여 stat 을 디스크에 캡처하기 시작합니다 .
  • 이 과정이 끝나면 "STAT StopFile" 을 타이프하여 로깅을 중지하고 stat 파일을 최종화 합니다.
  • 응용 프로그램이 시작될 때 즉시 stat 의 캡처를 시작하려면 매개변수 "-StartStatsFile" 을 전달합니다.
  • 콘솔에서, 명령 행 옵션 -DisableHDDCache 를 반드시 전달하십시오!
    • 이는 텍스처 mip 을 (stat 파일 기록을 겨루는) HDD 에 캐싱하는 일을 중지시킵니다.
  • Stat 파일들은 \UnrealEngine3\\Profiling\ 폴더로 내보내집니다.
    • 콘솔에서는 stat 데이터가 UnrealConsole 을 통해 자동으로 PC로 옯겨집니다.
  • StatsViewer 를 실행하고 파일을 로드합니다 (예: -07.15-18.58.ustats).

실행중인 게임으로부터 실시간 stat 을 캡처하려면:

  • 게임을 로드합니다.
  • Connect to IP 를 사용해서 StatsViewer 를 Xenon 세션에 연결합니다.
    • Xenon 에서, Xenon 의 "Title IP Address" 를 사용합니다. "Debug Channel IP Address" 를 사용하면 안됩니다.
      • UFE 에서 "Show All Target Information" 을 클릭하면 이것을 발견할 수 있습니다.
    • port 번호가 13002 로 설정되었는지 확인합니다.
  • UDP 접속을 통해 실시간 stat 이 흘러 들어오기 시작합니다!
  • 캡처한 데이터를 File -> Save 로 디스크에 저장할 수 있습니다.

Stat 데이터 보기:

  • StatsViewer 도구에서 .ustats 파일을 로드하거나, 라이브 게임 세션에 접속 합니다.
  • 대화식 그래프는 먼저 프레임 시간을 나타내므로, 힛치 및 스타일을 볼 수 있습니다.
  • Stat 을 왼편 칼럼에서 그래프 위로 끌어다 놓으면 stat 데이터가 표시됩니다.
  • 그래프에서 프레임을 클릭 하면 해당 프레임의 stat 데이터를 볼 수 있습니다.
  • 그 프레임의 호출 그래프를 열려면 그래프를 더블 클릭 하면 됩니다!
  • 왼편 칼럼에 있는 Stat 을 오른 클릭하면 "View Frames by Criteria (조건별 프레임 보기)" (예: FPS < 20 인 프레임에 한정, 등) 를 할 수 있습니다.
  • 메뉴의 옵션을 사용하면 보기 모드를 바꿀 수 있습니다 (프레임 번호 vs. 시간, 한정 범위 내/전체 데이터)

그밖의 노트:

  • LTCG 모드에서는 작용하지 않습니다 (STATS 를 로컬로 #define 하지 않는한). Release 모드를 사용하십시오.
  • 실시간 stat 캡처는 아직 뭔가 부족한 부분들이 있습니다 (프레임 떨구기, 스크롤 등이 약간 어색함) .

실시간 Stat 캡처에 대한 자세한 정보는 이 페이지 를 참고하십시오.

Script Profiling 을 사용하여 언리얼 스크립트 성능 튜닝하기

ScriptProfiler 는 스크립트 코드에서 비싸게 먹히는 함수들에 대한 좋은 정보를 많이 제공합니다. 이는 프로파일링 데이터를 지극히 빠르게 캡처하여, 짧은 샘플링 기간 동안 핫스팟에 즉각 접근할 수 있게 해줍니다.

스크립트 프로파일러 데이터를 캡처하려면:

  • 콘솔에서 "PROFILEGAME START" 를 타이프하여 데이터를 캡처하기 시작합니다.
  • 이것이 끝나면, "PROFILEGAME STOP" 을 타이프하여 캡처를 중지하고 데이터를 디스크에 저장합니다.
  • 프로파일링 데이터는 \UnrealEngine3\\Profiling\ 폴더로 내보내 집니다.
    • 콘솔에서는 stat 데이터가 UnrealConsole 을 통해 자동으로 PC로 옯겨집니다.
  • ScriptProfiler 를 실행하고 파일을 로드합니다 (예: -07.15-18.58.uprof).

자세한 정보는 게임플레이 프로파일러 문서를 보십시오.

주: 많은 경우에 StatsViewer 도구는 실제로 게임플레이 프로파일러보다 더욱 자세한 스크립트 프로파일링 데이터를 실시간 경비보다 많은 경비로 제공합니다. Stat 데이터를 캡처할 때 STAT SLOW1 로 정의했는지만 확인하십시오. 그러면 StatsViewer 는 해당 프레임에 대한 UnrealScript 호출 그래프 전부를 표시합니다!

콘솔에서의 성능

콘솔 특정의 성능에 대한 정보는 하위 페이지에 수록될 것입니다.

모든 Stat 명령어의 목록에 대해서는 Stats 해설 페이지를 참고하십시오.

모든 Console 명령어의 목록에 대해서는 콘솔 명령어 페이지를 참고하십시오.