UDN
Search public documentation:

PerformanceHomeKR
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 홈 > 퍼포먼스, 프로파일링과 최적화

퍼포먼스, 프로파일링과 최적화


개요


잘 실행되면서 메모리 제약에도 잘 맞는 게임을 만들기란 여러 시스템과 부문을 아우르는 흥미로운 주제입니다. 이 페이지는 그 싸움을 이기는 데 도움이 되는 여러가지 툴과 기술로의 관문입니다. 세계 최고의 툴을 가지고 있더라도, 항시 최소의 데이터/CPU 사이클로 원하는 것을 만들어내야 한다는 마음가짐이 필요합니다. 여기 나열된 툴과 기술이 그 작업에 도움이 될 것입니다.

그를 위해 큰 문제를 다수의 작은 문제로 나누어, 가급적 직교적인 방법으로 각 부분을 집중해 볼 수 있겠습니다. 이런 식으로 여러 명이 독립적으로 작업/조절 가능할 것입니다.

일반적인 유지비


게임이 실행되도록 유지하는 것은, 새 기능 추가와 예산 맞추기 사이의 끊임없는 줄다리기 입니다. 여러 명의 개발자가 다루고 있는 코드는, 지속적으로 변경되면서도 모두 들어맞아야 합니다. 게임은 타겟 플랫폼 제약을 맞춰야 합니다. 이러한 면을 모두 추적하고 게임이 계속해서 제대로 실행되는지 플레이 가능한지 확인하려면 지속적인 모니터링이 필요합니다.

Game Maintenance KR 페이지에는 제작중인 게임을 유지하기 위해 정기적으로 사용할 수 있는 툴과 기술이 여럿 소개되어 있습니다.

기본적인 툴과 기술


게임의 어느 부분에서 문제가 생기고 있는지 빠르고 쉽게 알아낼 수 있어야 함은, 제작 도중 매우 중요한 것입니다. 이로써 시간과 돈을 절약할 수 있습니다. 그러나 표준 게임 테스팅 상황에서 문제를 일으키기도 전에 문제가 생길만한 부분을 일찍 알아낼 수 있다면 시간을 훨씬 더 절약할 수 있습니다. 뭐가 문제를 일으킬지 알고 있다면, 다른 엘리먼트나 시스템이 그에 얽혀 더 큰 두통거리가 되기 전에 고치거나 우회할 수 있습니다.

Profiling Basics KR 페이지에는 현재 또는 앞으로 퍼포먼스 문제가 될 수 있는 게임 내 영역이나 엘리먼트를 식별하고 수정하는 데 사용할 수 있는 간단한 기술이 여럿 소개되어 있습니다.

Gameplay Performance Optimization KR 페이지에 인피니티 블레이드: 던전 개발 도중 사용되고 있는 게임플레이와 렌더링 최적화 방법 샘플이 소개되어 있습니다.

메모리 프로파일링


메모리 사용량은 비디오 게임에 있어서 항상 문제이며, 메모리 공간이 제한된 콘솔이나 모바일 디바이스에서는 특히나 더욱 그렇습니다. 이는 디스크의 콘텐츠 애셋이 차지하는 공간에서부터 메모리 allocation 및 deallocation 에 대해 런타임 도중 다양한 시스템의 메모리 사용량까지 확장됩니다. 이들 모두 메모리 사용량을 적정 선으로 제한하는 데 있어 극히 중요한 정보입니다.

메모리 사용량 및 프로파일링 페이지에 게임의 메모리 사용량을 인지하고 제어하기 위해 사용할 수 있는 툴과 기술이 여럿 소개되어 있습니다.

콘텐츠 프로파일링 및 최적화


오늘날의 게임에 사용되는 콘텐츠의 양을 보자면, 가급적 그 콘텐츠가 게임의 퍼포먼스에 미치는 악영향을 줄이는 것이 매우 중요합니다. 콘텐츠 최적화는 투자대비 효과가 가장 클 소지가 높기에, 가장 먼저 프로파일링 및 최적화 대상이 됩니다.

언리얼 엔진 3 에는 이 프로세스를 돕는 툴이 여럿 제공됩니다. 이 툴과 콘텐츠에의 악영향을 줄이는 법에 관한 팁은 콘텐츠 프로파일링 및 최적화 페이지에서 확인해 보실 수 있습니다.

CPU 퍼포먼스


CPU 상에서 엔진이 수행하는 작업은 스레드로 분할됩니다. 한 번에 여러가지 일을 수행하는 워커 스레드가 여럿 있을 수는 있지만, 두 가지 메인 스레드는 이와 같습니다:

  • GameThread - GameThread 는 게임플레이 업데이트를 처리합니다. 액터 티킹, 컴포넌트 티킹, 가비지 컬렉션 등이 포함됩니다.
  • RenderThread - RenderThread 는 라이팅 계산, 섀도잉 계산, 반투명 셋업, 씬 캡처 업데이트, 오클루전 등을 처리합니다.

CPU 상의 엔진 퍼포먼스를 관리한다 함은, 어느 한 스레드가 다른 스레드의 작업 완료시까지 기다리는 일이 없도록 하면서, CPU 에서 작업을 처리하는 데 걸리는 총 기간을 최소로 하는 것을 말합니다.

CPU 퍼포먼스 문제로 프레임 병목현상을 고립시키고 나서, 다음 단계 중 하나는 C++ 코드 중 어디에서 시간이 소비되는지 결정해야 할 것입니다. 추가적으로 Load-Hit-Stores 나 캐시 미스같은 감춰진 퍼포먼스 비용을 찾아볼 수도 있습니다.

대부분의 플랫폼에는 세부적인 코드 검사는 물론 심지어 라이브 세션에서 캡처된 데이터를 사용하여 C++ 코드용 콜 그래프를 제공해 주는 탄탄한 CPU 샘플링 툴이 있습니다. 예를 들어 윈도우 플랫폼에서는, 핫 스팟을 고립해 내기 위해 단기간에 걸친 샘플링 데이터를 캡처하고자 Intel VTune 을 사용할 수도 있습니다. 콘솔 플랫폼에도 비슷한 툴이 있는데, 보통 개발 툴 체인에 포함되어 있습니다.

이런 어플리케이션에 익숙해 져서 개발 전반적으로 광범위하게 사용하는 것이 좋겠습니다!

참고로 일부 콘솔의 언리얼에는 단일 프레임 CPU 샘플링 캡처의 수행을 돕는 유틸리티 함수가 있습니다. TRACE GAME 를 입력하면 CPU 추적을 시작할 수 있습니다.

대부분의 CPU 프로파일러는 샘플링 데이터 캡처 및/또는 단기간에 걸친 콜 그래프 데이터를 제공합니다. 지속적으로 저조한 프레임율을 포함한 퍼포먼스 문제 디버깅에 좋습니다. 샘플링 캡처 는 보통 C++ 코드 내 핫 스팟 함수 콜을 냅니다. 이는 가끔 유용할 수 있으나, 대개 콜 그래프 캡처 가 훨씬 쓸만하다는 것을 알게 될 것입니다!

콜 그래프 는 캡처-시간 부하가 조금 더 걸리지만 핫 스팟 함수의 콜러 에 대한 세부 정보를 제공하기에, 종종 문제의 중심지로 바로 안내해 주곤 합니다! 심지어 느린 것으로 나타나는 단일 함수를 호출하는 오브젝트/액터가 많이 있는 경우에도, 운만 따른다면 콜 그래프가 특정 액터 클래스 이름이나 원인의 힌트가 되는 패턴으로 안내해 주는 수도 있습니다.

가끔 콜 그래프가 단지 UnrealScript 만 시간을 잡아먹는다 하기도 합니다 (ProcessEvent, CallFunction 등으로의 호출). 이 경우 그러한 호출로 파고들기 위해 통계 뷰어게임플레이 프로파일러 세션 캡처를 해 볼 수도 있습니다.

프레임 버벅임 (hitch)를 다룰 때, CPU 프로파일러는 상대적으로 낮은 빈도때문에 다루기 어려울 수가 가끔 있습니다. 버벅임을 게임에서 쉽게 재현 가능하다면, 단기간의 CPU 프로파일링 세션 캡처 도중 그 버벅임을 가급적 자주 (이상적으로는 프레임당 수차례) 시작시켜 보는 것도 좋은 방법입니다. 버벅임이 잘 잡히지 않는다면, 여러 프레임에 걸친 콜 그래프 데이터의 히스토리를 제공해 주는 통계 뷰어 에서 사용할 캡처 데이터를 사용해 보는 것도 좋습니다.

게임 스레드 퍼포먼스

씬에 추가된 게임플레이 오브젝트는 모두 약간의 리소스를 차지하며, 일반적으로 가장 중심이 되는 오브젝트가 가장 많은 리소스를 차지합니다. 그러한 오브젝트에 충분한 GameThread CPU 시간을 확보하려면, 애먼 오브젝트가 리소스를 차지하고 있지는 않은지, 모든 오브젝트가 최소한의 작업으로 소기 목적을 달성하고 있는지를 확인해야 합니다.

GameThread 작업을 프로파일링하고 최적화하기 위한 기술, 팁, 툴 다수가 게임 스레드 프로파일링 및 최적화 페이지에 자세히 수록되어 있습니다.

렌더 스레드 퍼포먼스

라이팅과 섀도잉 관점에서 씬의 복잡도는, 다른 여러가지 프로세서-집약적 시각적인 면과 마찬가지로, RenderThread 에 소비되는 시간에 엄청난 영향을 끼칠 수 있습니다. 그 부분 중 어느 것이 RenderThread 를 느리게 하는 지를 알면, 그리 중요하지 않은 요소의 영향력을 줄이면서 중요한 요소에 리소스를 좀 더 많이 사용하도록 하는 데 노력을 집중시킬 수 있습니다.

렌더 스레드 프로파일링 및 최적화 페이지에서 RenderThread 가 처리하는 시각 요소의 프로파일링 및 최적화 방법 및 툴에 대한 데모를 확인하실 수 있습니다.

GPU 퍼포먼스


CPU 는 매 프레임마다 게임 업데이트와 계산을 처리하는 반면, GPU 는 게임 렌더링을 담당합니다. 확실히 하자면 폴리곤 그리기 뿐만 아니라, 셰이더 복잡도나 오버드로 다루기, GPU-skinned 스켈레탈 메시, 포스트 프로세싱 이펙트, 플루이드 서피스 등도 포함됩니다. GPU 작업 시간이 오래 걸린다면, 게임이 fill-bound 거나 다른 렌더링 요소가 퍼포먼스 문제를 일으키고 있다는 것을 말합니다.

GPU 가 렌더링 스레드에서 명령을 받아 하는 일은:

  • 버텍스 변형 및 스켈레탈 메시의 스키닝
  • 래스터화 (어느 픽셀이 어느 트라이앵글에 떨어지는지 알아내기)
  • 셰이딩 (주어진 트라이앵글의 모든 픽셀 위에 픽셀 셰이더 실행하기. 픽셀 셰이더는 그 트라이앵글에 주어진 머티리얼에 의해 제어됩니다.)

GPU 프로파일링에는 복잡한 특징이 많이 있습니다. GPU 퍼포먼스에 관련된 불문율이라면, 당연히 실험입니다. GPU 가 주로 시간을 잡아먹는 작업은 픽셀 셰이딩입니다. 사용된 셰이더의 복잡도, 그 셰이더가 차지하는 화면공간의 양, 반투명 셰이더로 발생한 오버드로의 양 등이 모두 GPU 프로파일링시 고려할 중요 요인입니다. 사용되고 있는 스켈레탈 메시의 버텍스 양은 큰 요인인데, 스킨된 버텍스가 스태틱 메시 버텍스보다 훨씬 비싸기 때문입니다. 확실히 하자면 GPU 퍼포먼스엔 그려지는 폴리곤의 양 역시도 문제가 있을 수 있는 부분입니다. 요즘의 그래픽 카드가 많은 폴리곤을 그려내는 기능이 있기는 하지만 말입니다. 그렇다고는 해도, 그릴 필요가 없는 폴리곤은 언제나 그리지 않도록 하는 것이 좋겠으며, 메시에 원하는 시각적인 결과물을 내기 위해 딱 필요한 만큼의 폴리곤만 쓰는 것도 좋겠습니다.

GPU 관련 정보 캡처를 돕고자, 일부 콘솔에서는 TRACE RENDER 명령을 내려 GPU 단일-프레임 샘플링 캡처할 수 있습니다.

PC와 다양한 콘솔 모두에서 GPU 프로파일링 지원용으로 쓸 수 있는 툴이 여럿 있습니다. GPU 퍼포먼스 및 프로파일링 페이지에, GPU 상의 어디에 퍼포먼스 문제가 발생중인지를 알아내기 위한 언리얼 엔진 3 제공 툴 및 외부 툴 사용법이 수록되어 있습니다.

네트워크 프로파일링


온라인 게임용 네트워크로 전송되고 있는 데이터 양을 요주의 대상입니다. 불필요한 데이터를 한다발 보내거나 네트워크를 특정 오브젝트 스팸으로 채우고 싶지는 않을 테지요. 네트워크 트래픽을 효율적으로 유지하면 모두에게 쾌적한 온라인 게임을 만들 수 있을 것이며, 대역폭이 제한된 경우라면 특히나 더욱 중요하겠습니다.

모바일 프로파일링


모바일 디바이스 게임 프로파일링 작업은 PC 프로파일링과 매우 유사합니다. 그래도 여러가지 플랫폼 전용 툴과 고려해야 할 사항도 몇 가지 있긴 합니다. 모바일 디바이스에서의 프로파일링 관련 세부사항은 Mobile Profiling Home KR 페이지를 참고해 주시기 바랍니다.