UDN
Search public documentation:

PerformanceAndMemoryKR
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

이 페이지는 퍼포먼스, 프로파일링, 최적화 홈 페이지를 대신합니다. 언리얼 엔진 3 의 프로파일링과 최적화 관련 정보에 대해서는 해당 페이지를 참고하시기 바랍니다.

UE3 홈 > 테크니컬 & 프로그래밍 홈 > 퍼포먼스와 메모리 사이

퍼포먼스와 메모리 사이

개요

제한된 메모리에 잘 맞으면서 잘 돌아가는 게임 만들기란, 수많은 시스템과 여러 분야에 걸친 화두입니다. 이 페이지가 그 지리한 전투를 승리로 이끌어 줄 여러가지 기술과 도구를 소개해 드리는 관문이 되었으면 합니다. 다만 세계 최강의 도구가 있다손 치더라도, 뭘 만들든 최소한의 데이터 / CPU 사이클로 만들어야 한다는 마음가짐을 잊지는 말아야 하겠습니다. 여기 있는 기술과 도구를 통해 그 위업을 이루실 수 있도록 도와드리겠습니다.

먼저 큰 문제를 작은 문제 여럿으로 쪼개서 각 부분을 가급적 상세히, 직교적인(겹치지 않는) 방법으로 작업하는 데 초점을 맞추는 것이 좋습니다. 그래야 여럿이서 개별적으로 작업/조율할 수 있기 때문입니다.

각 부분에는 개요를 두고, 그 부분에 관련된 모든 도구/기술을 덧붙이는 식으로 기술하겠습니다. 각 도구/기술을 왜 사용해야 하는지 그 이유도 간단히 곁들이고요. 여기서는 먼저 간략한 개요를 알려드리고, 각 도구/기술 활용법 전부가 자세히 적혀 있는 상세 페이지로 안내해 드리도록 하겠습니다.

게임 실행 유지하기

게임 실행을 유지하기란 지속적인 신기능 및 콘텐츠 추가 대 예산 맞추기 사이의 줄다리기 작업입니다. 콘텐츠를 새로 추가할 때면 자주 잘못된 설정 혹은 기존 콘텐츠보다 비대해진 채로 추가되곤 합니다. 보통 이런 오점은 그저 악의없는 실수입니다만, 콘텐츠가 많은 요즘 게임에서는 그런 걸 추적해 내기가 쉽지 않습니다.

게임 실행 유지를 도와줄 도구/기술은 다음과 같습니다:

연속 통합

악성 체크인으로 인한 빌드 브레이크에 대해서 빠르게 알아봅니다.

ContentAudit 커맨드릿

바로 확인하고 손봐줘야 될 것 같은 "문제있는" 콘텐츠를 찾아냅니다.

매일 자동 스모크 테스트

거의 실행되지 않는 코드의 크래시 / 문제를 잡아냅니다.

매일 플레이 테스트

게임이 항시 플레이가능한지 확인하여, 고립된 테스트 레벨을 살펴보는 시간을 절약시켜 줍니다.

매일 QA 퍼포먼스/메모리 측정

퍼포먼스 / 메모리 저하를 쉽게 잡아낼 수 있습니다.

FixUpRedirects 커맨드릿

불필요한 콘텐츠 로드를 유발하는 redirector가 없는지 확인합니다.

Sentinel

지정된 레벨의 퍼포먼스 및 메모리 통계를 수집하는 자동화 시스템입니다.

SetTextureLODGroup 커맨드릿

텍스처가 올바른 LOD 그룹에 있는지 확인하고 그른 텍스처 설정을 고쳐줍니다.

일반 최적화

여기 최적화 중 귀사의 게임에다 적용하려는 것들 전부에 대해, 가능만 하면 전체적으로 적용해도 좋을 기술들은 다음과 같습니다.

퍼포먼스 디버깅 페이지에도 퍼포먼스 문제, 병목, 버벅임 현상 추적에 대한 정보가 있습니다.

걍 꺼버려!

최적화 하느라 허송세월 보내기보단, 가끔은 걍 꺼버리는게! 나을 수도 있습니다.

벽보기

벽을 보고 렌더링되지 않는데도 CPU를 계속 잡아먹고 있는게 뭔지 알아보는 면벽 수행입니다.

A형 N개 스폰시켜 과장하기

동일 유형 오브젝트를 N개 둬 보면 정말이지 엔진 나머지 기능에 허우적대지 않고도 어느 부분이 느린지를 알아볼 수 있습니다.

버벅임 (Hitches)

보통 선 검사나 길찾기를 할 때 발생하는 런타임 버벅임을 빠르게 잡아내는 데 유용한 STAT 명령입니다. 버벅이는 프레임을 잡아내려면 Max 값을 살펴 보시기 바랍니다.

  • STAT UNITMAX - STAT UNIT 명령보다 버벅임을 잘 잡아냅니다.
  • STAT COLLISION - "Multi Line Check" 와 "Single Line Check" 를 보십시오.
  • STAT NAVMESH - "Generate Path" 를 보십시오.
  • STAT SLOW - 10ms 보다 느린 통계를 전부 나타냅니다. 끄려면 STAT NONE 을 쳐야 하는 것 같습니다.

메모리

항상 들여다보며 관리하에 두는 곳 중 하나는 게임이 활용하는 메모리 양입니다. 뭐가 메모리를 사용하는지에 대한 식견이야 말로 이 과정의 핵심입니다. 다음 작업이 도움이 될 겁니다.

또한 메모리 디버깅 페이지에서 메모리 누수, 부풀림, 조각화 문제 추적에 대해 알아보실 수 있습니다.

항상 로드되는 콘텐츠

사용되지 않는데도 항상 비용이 발생하는게 뭔지 알아보기. 이걸 최소화해야 하겠습니다.

참조 콘텐츠 분석

맵 세트를 살펴보고 그 맵 콘텐츠의 전역 사용량에 더해 참조하는 콘텐츠도 표시합니다. 최적화 비용에 대한 최대 효과를 끌어내는 데 집중해 볼 수 있겠습니다.

ContentComparison 커맨드릿

전체 콘텐츠를 살펴보고 애셋간의 상대적 비용을 확인해 볼 수 있습니다.

핫 스팟 리포트 생성

레벨 디자이너를 위한 "핫 스팟 리포트" 만드는 법 안내서입니다. 이 리포트는 QA 부서가 만들기에 적당할 것이며, 서브레벨 스트림 인/아웃으로 인한 메모리 급락을 알아내기에 좋습니다. 어느 버킷이 메모리를 가장 많이 차지하는지, 어떻게 하면 레벨을 메모리에 더 잘 들어맞도록 최적화시킬 수 있는지 파악하는 데 도움이 될 것입니다.

DVD 풋프린트

DVD 풋프린트(footprint)가 뭔지, 데이터가 어떻게 분산되어 있는지 알아봅니다.

실행파일 크기

실행파일 크기가 실수로 불어날 수 있습니다. 실행파일 안에 뭐가 있는지 알아보면 좋겠습니다.

FindDuplicateTextures 커맨드릿

콘텐츠 전부를 살펴보고 시간에 따라 복제된 텍스처를 찾아내고, 텍스처의 한 버전만 가르키도록 참조를 수정합니다.

콘텐츠용 막대그래프

애셋 할당 상황을 막대그래프 / 옆에다 범주 목록에 갯수를 추가해서 보면 정말 좋습니다.

Per Poly Collision

폴리별 충돌(Per Poly Collision)은 모든 메시에 필요한 기능이 아니라 꺼주면 메모리가 절약됩니다.

레벨 최적화

레벨에 뭔가 느려지게 만드는 것은 없는지 확인하는 데 레벨 디자이너가 활용할 수 있는 기술 몇 가지에 대한 개요입니다.

MemLeakCheck

메모리를 써대는 것들을 전부 출력하는 명령입니다. 메모리가 어디로 가는지, 비교(diff)해 볼 수도 있는 빠르고 편한 개요가 제공됩니다.

Memory Profiler

메모리가 어디에 할당되는지 정확히 보여주는 도구입니다. UObject 이외의 누수를 추적할 때 좋습니다.

커지는 풀

엔진의 풀(pool) 중 다수는 시간에 따라 커지는 것도 있습니다.

TArray Slack

TArray가 공간을 낭비하고 있지는 않은지 확인합니다.

텍스처 풀

텍스처 풀(Texture Pool) 크기는 고정입니다만, 텍스처의 설정에 따라 풀 내부에서 벌어지는 일이 달라집니다.

미사용 애니메이션

사용되지 않는 애니메이션도 귀중한 메모리를 차지합니다. 그런 것들을 찾아내 없애는 방법을 알아봅니다.

게임스레드

씬에 추가된 오브젝트는 죄다 리소스를 잡아먹습니다. 보통 가장 재밌는게 가장 많이 잡아먹죠. 그런 오브젝트에다 게임스레드 CPU 시간을 충분히 쥐어주려면, 다른 오브젝트가 자원 활용을 불공평하게 하고 있지는 않은지, 목표 달성을 위해 최소한의 작업만을 하고 있는지를 확인해야 겠습니다. 그런 작업을 효과적으로 할 수 있게 돕는 전용 도구/#define이 많이 있습니다.

프로파일링 셋업에 대해서는: 퍼포먼스 디버깅

AI 로깅

AI 작업 어떤게 비싼지 알아봅니다.

애니메이션

애니메이션의 느린 지역 선별법.

로그 메시지에 뜬 문제 정리하기

로그는 내 친구, 친구가 하는 말을 무시하지 말고 찾아내 고칩시다!

Dynamic Light Environment 업데이트

Dynamic Light Environment, 동적 빛 환경에는 퍼포먼스와 멋 두마리 토끼를 노리는 설정이 여럿 있습니다. 애셋 종류에 맞는 적절한 설정이 핵심입니다.

가비지 컬렉션

쓰레기로 수거되는 건 뭔지, 그 변동(churn)을 줄인다는게 뭔지 이해해 봅시다.

전처리 코드 제외를 통한 최적화

발매 게임에서는 절대 쓰이지 않을 것들의 실행 및 링크를 피하는 방법.

선 검사

프레임별 라인 체크 횟수 최소화하기.

로딩 퍼포먼스

레벨 스트리밍 시간이 오래 걸리는 이유를 알아내 봅시다.

LOOKING_FOR_PERF_ISSUES

엄청 강력한 #define LOOKING_FOR_PERF_ISSUES 1 활용하기.

엔진의 풀

스폰 퍼포먼스 도우미 풀이 여럿 있습니다. 사용중인지 확인해 봅시다.

NavMesh 퍼포먼스

어떤 액션이 NavMesh를 느리게 하는지 알아봅시다.

MoveActor

MoveActor가 여럿 있을 때, 어느게 느린지 아는 게 중요합니다.

파티클

어느 파티클 시스템이 가장 비싼지 찾아봅니다.

프레임별 비싼 업데이트

매 프레임마다 뭔가는 벌어지는데, 어떤건 다른 것보다 비쌉니다. 어떤게 그런 건지 알아내야겠죠.

피직스

피직스는 비동기식 실행이지만서도 여전히 비쌀 수 있습니다.

게임스레드 프로파일링

게임스레드를 프로파일링할 때 사용할 기술.

스켈레탈 메시 컴포넌트 업데이트

스클레탈 메시의 어느 부분이 느린지 알아내는 기술.

느린 언리얼스크립트 함수 호출

언리얼스크립트 최적화야말로 뛰어난 향상이 기대되는 곳입니다. 가장 느린 함수를 찾아다가 c++로 변환하거나 작업 내용을 최적화시켜 줍시다.

막 스폰하면 느립니다

오브젝트를 마구 스폰하면 느려지니, 그러지 맙시다.

이벤트 기반 오브젝트용 TickableActors 목록

다수의 액터는 매 프레임마다 틱할 필요 없이 이벤트에 따라 "활성화"시켜주기만 하면 됩니다.

유용한 실행 명령

엔진에는 쓸만한 실행(exec) 명령이 많이 있습니다. 몇 개 자세히 알아봅시다.

렌더스레드

충실도를 줄일 렌더스레드 구역

분할화면이 있을 경우, 렌더스레드가 대부분의 작업을 두 번 해야 합니다. 그래서 대부분의 경우 충실도(fidelity)를 줄이거나 꺼야 하겠습니다.

렌더스레드 프로파일링

렌더스레드를 프로파일링할 때 활용할 두 가지 기술.

GPU

디테일모드로 끄기

퍼포먼스가 달리는 GPU를 쓰고 있거나 너무 많이 렌더링해야하거나 할 때는 가끔 꺼버리는 게 상책입니다.

동적 그림자

어느 오브젝트가 동적 그림자 혹은 너무 긴 그림자를 드리우는지 알아보기.

셰이더 복잡도

셰이더가 생각대로 돌아가고 있는지, 시각적 이득 없이 GPU 사이클을 허비하진 않는지 확인합니다.

플랫폼 전용 GPU 도구

각 플랫폼에는 프로파일링을 효과적으로 돕는 전용 GPU 도구가 여럿 있습니다.

FreezeAt 콘솔 명령

더 나은 프로파일링을 위해 뷰를 주어진 뷰에 고정시킬 수 있는 콘솔 명령입니다.

네트워크 대역폭

DevNetTraffic

클라이언트에 뭐가 전송되는지 정확히 보여줍니다.