언리얼 프로파일링 -기초 지식

MoOrY·2023년 10월 31일
0

언리얼 엔진

목록 보기
35/41

https://www.youtube.com/watch?v=hGLIqru5wnI

프로파일링이란?

프로파일링은 범행 수법을 추론한 뒤 이를 바탕으로 범인을 찾아내는 수사 기법
따라서 오래전에 생긴 문제는 증거와 기록이 남아있지 않아 범인을 찾아내기 어렵다.
따라서 출시 직전에 몰아서 하는 방법은 좋지 않다. 꾸준히 프로파일링을 해서 최적화 관리를 하고, 프로파일링 이후 문제가 있으면 바로 최적화하자.

최적화를 위해 살펴봐야 할 요소들

게임이 느려지는데엔 여러 요소가 있을 수 있다. 병목 지점을 먼저 찾고, 어떤 부분에서 부하가 걸리는지, 용의자를 하나씩 줄이는 방법이 필요하다.

CPU- AI, 물리, 블루프린트 틱, 드로 콜..
GPU- 그림자, 오버드로, UI, 반투명, 라이팅..
I/O- 영상 재생, 레벨 로딩, 텍스처 로딩
네트워크- 대역폭, 전송 지연
메모리- GC, Out of Memory
발열로 인한 가속(쓰로틀링)
...

성능 지표의 활용

레퍼런스 하드웨어를 선정하고, 목표 프레임 레이트를 설정한다.(예를 들어 PS5에서 30프레임을 목표로 두는 등)
30프레임의 경우, 1프레임 처리에 33.3ms, 60프레임의 경우 16.6ms 시간이 걸려야 한다.

CPU 예산 편성(ms단위 사용)
예) Ai(5ms) + Animation(3ms) + Character(3ms) + Physics(5ms) + UI(5ms) + Particles(5ms) = 26ms
1프레임을 처리하는 데 1ms가 더 걸리게 된다면, 1프레임이 떨어지게 된다.

GPU 예산 편성
메테리얼 인스트럭션 수, 폴리곤 수, 동시에 영향받는 동적 라이트 수 등 아트팀의 작업물에 지정된 제한을 둔다

서버당 수용가능한 동시 접속자 수 및 서버 운영비용을 체크하여 BM이나 기획 방향성에 영향을 줄 수 있다
(예상 매출액보다 서버 비용량이 더 많이 든다면 BM을 수정해야 할수도)

패키지 사이즈, 메모리 예산 편성

성능 지표의 관리

지표의 영향을 주는 요소를 최소화, 일정한 기준을 만들어 일관되게 측정해야 한다
레퍼런스 디바이스를 사용하고, 외부 프로그램과 안티 바이러스 실시간 감지를 OFF
예) A맵을 열어서 B카메라로 30초 동안 측정하여 최저 값을 사용

정기적으로 꾸준히 기록해서 트렌드를 관리한다. 테스트 자동화와 CI통합을 추천

하드웨어와 최적화

2차 저장장치

게임의 용량을 최적화 해야 한다. 특히 저장공간이 부족한 모바일의 경우 중요, 인터넷 속도가 떨어지거나, 인터넷 인프라가 좋지 않은 국가에선 큰 용량으로 인한 트래픽 부담이 클 수 있다.

2차 저장장치 - 메인 메모리 (SATA, NVMe)

2차 저장장치에 저장된 파일이 메인 메모리로 올라갈 땐, 시스템 버스를 타고 가게 된다. 이 시스템 버스에 따라 전송 속도에 제한이 있을 수 있다.
큰 규모의 맵이나 많은 캐릭터를 동기 방식으로 로딩한다면, 무한 로딩 화면을 보게 할 수도 있다.
언리얼의 경우 비동기로 텍스처를 로딩하는 스트리밍 기능을 기본 지원하며, 게임을 플레이하기 위한 최소한의 리소스만 로딩하면 게임이 시작될 수 있도록 하는 기능을 지원한다.

메인 메모리

필요한 컨텐츠를 무한정 메모리에 올릴 수 없다. 메모리가 부족하여 메모리 할당에 실패하면 Out of Memory로 크래쉬가 뜰 수 있다.

메인 메모리 - CPU (DDR, L1,L2,L3 캐시)

CPU와 L1,L2,L3캐시, 메인 메모리, 2차 저장장지들간의 속도는 큰 차이가 있다. 캐시 적중률이 높도록 같은 메모리를 참조하는 작업은 모아서 한번에 수행하도록 하자

CPU

게임로직, AI, 물리연산, 충돌 오버랩 테스트, 파티클 시스템, 블루프린드 틱, 드로 콜 등 렌더링을 제외한 거의 모든 작업을 담당한다.

비디오 메모리VRAM

그래픽 카드에서 렌더링 연산을 하기 위해 텍스처나 지오메트리 데이터 등을 VRAM으로 복사해줘야 한다. VRAM용량을 초과하지 않도록 주의해줘야 하며, 너무 큰 텍스처를 사용하면 VRAM이 많이 낭비된다.

GPU

많은 수의 폴리곤이나 픽셀 데이터를 처리하기 위해 많은 코어를 내장하고 있다. 처리할 수 있는 데이터양이나 연산을 조절하여 GPU병목이 일어나지 않도록 주의

발열

모바일 플랫폼의 경우 쓰로틀링으로 인한 성능 하락을 고려해야 한다. 발열량은 전압의 제곱만큼 오르기 때문에, 발열을 잡지 못하면 성능을 올릴 수 없다. 레퍼런스 하드웨어에서 테스트할 때, 쓰로틀링이 걸리면 정확한 측정값을 얻을 수 없으므로, 모바일의 경우 모바일 전용 쿨러를 장착하여 쓰로틀링이 없는 상태에서 측정해야 한다.
발열을 줄이기 위해선, 하나의 코어만 갈구기보단 여러 개의 코어들을 균형있게 사용해야 한다.

언리얼 엔진의 스레드 모델

언리얼 엔진의 경우, 1개의 프레임을 처리하기 위해 다음 스레드들을 병렬로 처리하도록 되어 있다.

게임 스레드

게임 로직을 처리한다. 이 과정에서 생기는 드로우 콜들을 렌더링 스레드에 옮겨 처리하도록 한다.

렌더링 스레드

드로우 콜을 렌더링 커맨드로 만들어 그래픽 카드로 보내게 된다.

RHI 스레드

렌더링 커맨드 해석을 병렬로 하기 위해서 사용되며, 플랫폼에 따라 없을 수도 있다.

이 과정에서 게임 스레드의 일이 끝난 후 RHI 스레드가 완료될 때까지 기다리는 등, 프레임 사이사이에 일부 스레드가 일을 하지 않고 노는 구간이 발생하여 멀티코어 효율이 떨어지는 현상이 생기는데, 언리얼 엔진에선 이를 위해 만약 게임 스레드가 일을 다 마치고 다른 스레드들이 일을 마칠때까지 그냥 기다리는 대신, 다음 프레임에 대한 연산을 미리 시작하도록 되어 있다.

CPU Affinity(CPU 선호도)

모든 코어가 동등한 성능을 내는 PC CPU와는 달리, 모바일이나 콘솔 CPU는 고성능이지만 발열량과 전력소모량이 높은 Big 프로세서와 성능은 떨어지지만 저전력인 고효율 Little 프로세서가 조합된 형태가 많다.
특정 스레드를 특정 CPU에 고정시키는 방법으로 최적화가 가능하지만, 칩셋마다 Big, Little코어 개수와 클러스터 구성이 달라질 수 있다. 클러스터 간 캐시 공유가 안되고, 클러스터간 Context Switch 비용이 커서 잘못 사용하면 오히려 성능이 하락될 수 있다.
이러한 방법을 사용하기 위해선 해당 플랫폼에서 많은 테스트를 거쳐 정확한 방법을 찾아내는것이 중요

profile
필기용 블로그입니다.

0개의 댓글