언어:
페이지 정보
태그:
엔진 버전:
언리얼 엔진

텍스처 스트리밍 지표 보고

언리얼 엔진

4.15 버전 이후 STAT STREAMING 콘솔 명령으로 텍스처 스트리밍 통계 프로파일링이 가능합니다. 텍스처 스트리머의 퍼포먼스, 메모리 사용량, 기타 사용된 지표를 보고해 줍니다.

STAT STREAMING sortby=name maxhistoryframes=1

StatStreaming.png

메모리 데이터를 읽을 때, "pool" (풀) 이란 용어는 개념적 (확보된) 메모리를 말하며, 실제 차지하는 메모리와는 관계가 없습니다. "mips" (밉)은 텍스처가 사용하는 현재 메모리를 말하며, 예상 또는 미래 사용량은 아닙니다. 메모리 지표는 크게 세 가지 풀로 분류됩니다:

  • Texture 텍스처

  • Streaming 스트리밍

  • Wanted 원티드

이 풀 크기는 Memory Counters 카테고리의 각 줄 오른쪽에 나타납니다.

통계

설명

Cycle Counters 사이클 카운터

Game Thread Update Time

게임 스레드 업데이트 시간 - 스트리머 업데이트 함수에 걸린 시간입니다. 대부분의 텍스처 스트리밍 작업에 해당합니다. 텍스처 스트리머 외부에서 처리되는 작업은 소수인데, 텍스처나 컴포넌트 또는 레벨로의 레퍼런스 제거같은 것이 그렇습니다. 게임 스레드 업데이트 도중 스트리머는 전체 업데이트를 향해 한 단계 나아갑니다. 전체 업데이트는 몇 프레임에 걸쳐 일어나며, r.Streaming.FramesForFullUpdate 와 관계가 있습니다. 통계의 Counter 섹션에 정의된 것처럼, 여러 업데이트 단계가 있습니다.

Memory Counters 메모리 카운터

Texture Pool

텍스처 풀 - 텍스처 리소스에 사용할 수 있는 총 메모리입니다. 렌더 타깃, GPU 파티클 버퍼, 큐브맵, UI 텍스처, 스트리밍되지 않는 텍스처 등 스트리밍되지 않은 리소스를 포함합니다. 일부 플랫폼에서는, 이 메모리를 사용하여 스태틱 메시같은 텍스처가 아닌 리소스를 저장합니다. Texture Pool 은 대략 Safety Pool + Temporary Pool + Streaming Pool + NonStreaming Mips 와 같습니다 (변동 폭이 있다면, 최대 Safety Pool 크기입니다).

Safety Pool

안전 풀 - 이 값은 Engine 구성 파일의 [TextureStreaming] 아래 MemoryMargin 에 설정됩니다. 예상치 못한 (스트리밍되지 않는) 할당에 예약된 메모리입니다. 가용 메모리가 이 값 이하만큼 주기적으로 변동하는 경우, 텍스처 스트리머는 이 변동량만큼 최대한으로 자신의 스트리밍 풀을 안정화시킵니다. 보통의 (예상) 변동이 안전 풀 크기 이상을 차지하는 경우, 텍스처 스트리머는 지속적으로 자신의 예산에 맞추어, 텍스처 스트리밍 인/아웃 무한 사이클을 생성할 수도 있습니다.

Temporary Pool

임시 풀 - 이 값은 r.Streaming.MaxTempMemoryAllowed 로 제어하며, 텍스처 크기조절 시 스트리머가 얼마만큼의 추가 메모리를 사용할 수 있을 것인지를 지정합니다. 텍스처의 밉 수를 변경할 때, 엔진은 더 크든 작든 새로운 텍스처를 만들어야 하며, 여기에 앞으로의 밉 데이터가 저장됩니다. 이것이 들어오는 요청 양을 간접 제어하게 되는데, 스트리머는 임시 풀이 허용하는 한 가급적 많은 요청을 IO 시스템에 전송하기 때문입니다.

참고로 텍스처 풀은 최소한 스트리밍할 리소스 중 가장 큰 것 이상의 크기는 되어야 하지만, 너무 크게 설정하면 메모리가 (그 목적으로만 예약되므로) 낭비됩니다. 반면 너무 적게 설정하면 (IO 시스템이 충분한 작업을 하지 못하고 빈둥거리게 만들어) 스트리밍 속도가 떨어질 수 있습니다. 또 한가지, 스트리머는 들어오는 요청 내 처리 순서에 대한 제어권이 매우 적습니다. 즉 상대적으로 작은 임시 풀을 사용하면 처음 로드되는 것을 더욱 잘 제어할 수 있다는 뜻입니다.

Streaming Pool

스트리밍 풀 - 텍스처 스트리머가 사용할 수 있는 메모리 양입니다. 스트리머는 보통 가용 메모리 전부를 새로운 밉 스트리밍 아니면 기존 스트리밍된 밉을 메모리에 가급적 오래 유지하는 데 사용합니다. 스트리밍 풀에는 Visible Mips, Hidden Mips, Force Mips, Cached Mips. 가 들어있습니다. 스트리밍 풀 은 대략 Visible Mips* + Hidden Mips + Forced Mips + Cached Mips 와 같습니다 (*: 전체 사용시이며, 그렇지 않으면 미사용 공간을 고려해야 합니다).

NonStreaming Mips

스트리밍 이외 밉 - 스트리밍 이외 할당에 사용되는 메모리 양입니다. 이 할당이 정기적으로 안전 풀 값 이상 변동하는 경우, 스트리밍 풀 예산에 영향을 끼칠 것이기에 (할당을 줄이거나 안전 풀을 키워) 피해야 할 것입니다.

Required Pool

필수 풀 - 텍스처 스트리머가 지표에 따라 로드해야 할 밉 데이터 양입니다. 텍스처 스트리밍 풀의 100% 를 초과할 수 있으며, 그 경우 약간의 절충을 통해 일부 텍스처는 필수 해상도로 로드되지 않을 것입니다.

Visible Mips

보이는 밉 - 보이는 텍스처 밉이 현재 차지하는 원티드 메모리입니다. 강제 밉은 포함하지 않습니다.

Hidden Mips

숨겨진 밉 - 보이지 않는 텍스처 밉이 현재 차지하는 원티드 메모리입니다. 강제 밉은 포함하지 않습니다. 텍스처를 처음 표시할 때 저해상도 텍스처가 보이는 것을 방지하기 위해 스트리머는 텍스처를, 보통 필요한 것보다 하나 적은 밉으로 미리 스트리밍합니다 (r.Streaming.HiddenPrimitiveScale 참고).

Forced Mips

강제 밉 - 강제로 스트림 인 된 텍스처가 현재 차지하는 원티드 메모리입니다. 텍스처는 보통 짧은 기간 게임플레이 메커니즘을 통해 강제 스트림 인 됩니다. non-streamable (스트리밍 불가) 플래그 설정된 텍스처는 포함하지 않습니다.

Cached Mips

캐시된 밉 - 더이상 필요치 않은 텍스처 밉이 차지하는 메모리입니다. 다른 원티드 밉에 메모리가 필요하지 않은 이상 캐시에 유지됩니다.

Wanted Pool

원티드 풀 - 결국 스트림 인 될 필수 풀의 일부입니다.

Wanted Mips

원티드 밉 - 원티드 풀의 얼마만큼이 실제 스트림 인 되는지 입니다. 100% 에 도달하면, 스트리머는 새로운 밉 로드를 위한 IO 요청 전송을 중지합니다. Wanted Mips* 는 Visible Mips + Hidden Mips + Forced Mips** 입니다.

Inflight Requests

들어오는 요청 - IO 가 계속해서 처리해야 하는 메모리 양입니다. 0 이면 기존 요청은 전부 새 요청 생성 시 처리된 것입니다. 스트리머가 콘텐츠를 스트리밍할 때 이런 일이 발생하면, 스트리머가 사용가능한 대역폭 전부를 사용하지 않고 있음을 나타냅니다. r.Streaming.MaxTempMemoryAllowed 를 늘리는 것으로 (낭비되는 메모리 양은 많아지지만 로드 순서 제어가 적어져서), 또는 r.Streaming.FramesForFullUpdate 를 줄이는 것으로 (업데이트 시간은 길어지지만) 대역폭을 확보할 수 있습니다.

IO Bandwidth

IO 대역폭 - 지난 업데이트 이후 완료된 밉 로드 크기를, 지난 업데이트 이후 시간으로 나눈 것입니다. 정확한 IO 대역폭 측정은 아니지만, 시스템이 요청 로드를 얼마나 빨리 하는지 파악하는 데는 여전히 사용 가능합니다.

Counters 카운터

Setup Async Task

비동기 태스크 셋업 - 비동기 스트리머 태스크에 대한 데이터를 준비하는 데 걸린 시간입니다. 전체 업데이트 루프의 첫 단계로 실행됩니다.

Update Streaming Data

스트리밍 데이터 업데이트 - 스트리밍 데이터를 점증적 업데이트하는 데 걸리는 시간입니다. 비저빌리티 새로고침, 텍스처 상태 업데이트, 사용된 다이내믹 컴포넌트의 바운드 업데이트 등을 포함합니다. 이 단계는 r.Streaming.FramesForFullUpdate 에 정의된 대로 연속 여러 프레임 실행됩니다.

Streaming Texture

스트리밍 텍스처 - 로드 및 취소 요청을 준비하고 전송하는 데 걸린 시간입니다.

새로 로드되는 레벨의 점증적 처리

언리얼 엔진 4.15 부터 텍스처 스트리머는 레벨 데이터를, 각 프레임마다 로드될 때와 보이게 되는 순간 사이의 찰나에, 점증적으로 처리합니다. 기존에 이와 같은 처리는 레벨이 보이게 되는 프레임에 일어나 그 와중에 버벅임이 느껴질 수 있었습니다.

매 프레임마다 처리되는 작업량은 r.Streaming.NumStaticComponentsProcessedPerFrame 으로 제어하는데, 기본값은 50 입니다. 이 값을 0 으로 설정하면 점증적 방식이 비활성화되어 시스템이 4.15 이전 방식으로 작동하도록 만듭니다.

한 가지 중요한 점은, 점증적 레벨 처리는 모빌리티가 스태틱 설정된 컴포넌트에만 적용된다는 점입니다. 무버블 컴포넌트는 항상 엔진 틱에서 점증적 처리되고 있었습니다.

점증적 처리가 완료된 이후에는, 레벨이 보이기 전까지 더이상의 처리는 필요치 않습니다. 점증적 처리 완료 전 보이게 되면, 대기중인 모든 작업은 즉시 완료시켜야 하는데, 이 때 작은 버벅임이 생길 수 있습니다.

점증적 처리를 조사하는 콘솔 명령은 다음과 같습니다:

Stat Streaming SortBy=name

이 비용은 Update Streaming Data 카테고리에 포함됩니다.

퍼포먼스

4.15 에서 텍스처 스트리머가 향상되어, 다음 정보 목록은 목표 향상치와 함께 어떻게 향상되었는지에 대한 구체적인 지표 설명입니다.

텍스처 스트리머가 차지하는 텍스처 수 감소

컴포넌트별 비저빌리티 처리로 향상되었습니다. 보이지 않거나 숨겨진 컴포넌트에 사용되는 텍스처는 일종의 프리페치로 밉을 하나 낮춰 스트리밍합니다. 머티리얼별 텍스처 스트리밍 데이터의 추가 역시 디테일 맵과 같은 것에 대한 UV 채널에 적용된 스케일을 올바르게 계산하는 식으로 도움이 되었습니다.

마지막으로 이 부분의 다른 개선사항은 스태틱 지오메트리에 대한 머티리얼별 바운드를 (작게) 계산하는 데서 온 것입니다.

아래 지표는 파라곤에서 레벨을 세 가지 시점으로 바라본 것에서 얻은 것입니다.

필수 텍스처 풀

이전

이후

보이는 양

스타트업

678 MB

564 MB

370 MB

맵 사이드 레인

796 MB

597 MB

308 MB

맵 미들 레인

1086 MB

674 MB

271 MB

보이는 텍스처의 스트림 인 시간 감소

(글로벌 텍스처 예산 감소 이외에) 보이는 텍스처를 스트림 인 시키는 데 걸리는 시간을 줄이기 위해, 스트리머는 보이는 밉과 예산으로 잡힌 밉의 표를 유지합니다. 예산으로 잡힌 것들 중 보이는 밉의 기록을 유지함으로써, 스트리머는 프리페치 및 강제 로드 데이터의 스트림 인 전 감지가능 데이터를 스트림 인 할 수 있습니다.

아래 지표는 파라곤에서 레벨을 세 가지 시점으로 바라본 것에서 얻은 것입니다.

보이는 맵 로드

이전

이후

스타트업

20s

10s

맵 사이드 레인

19s

9s

맵 미들 레인

20s

6s

스트리머에 걸리는 CPU 시간 감소

다이내믹 컴포넌트 처리를 비동기 텍스처 스트리밍 태스크로 이동시키는 식으로 CPU 시간이 향상되었습니다. 과예산 상황 처리 및 텍스처 로드 순서 결정같은 다른 것들도 이동시켰습니다.

아래 예제에서, 파라곤의 최악 업데이트 프레임 향상을 보여줍니다.

게임 스레드 업데이트 비용

이전

이후

최악 업데이트 프레임

1.1 ms

0.6 ms

이 영역에서 또 한가지 핵심 개선사항은 레벨이 로드는 되었지만 아직 보이지는 않는 상황에서 새로 로드된 레벨 스트리밍 데이터의 점증적 처리 부분입니다.

게임 스레드 레벨 로드 비용

이전

이후

점증적 업데이트

150 ms

3 ms

로우 퀄리티 및 악성 행위 제거

메시 UV 밀도는 메시 단위가 아닌 머티리얼 단위로 계산됩니다. 이 새로운 데이터를 LOD 에도 적용합니다. 이로 인해 텍스처가 저해상도로 나타나는 대부분의 문제가 해결되었습니다.

또한, 파티클 시스템 및 인스턴스드 메시를 포함, 컴포넌트에서 더욱 폭넓은 텍스처 스트리밍이 지원됩니다. 이로 인해 기타 저해상도 문제와, 가끔은 높은 메모리 소모량 문제가 해결됩니다.

다양한 메모리 예산 별 수동 트윅 제거

텍스처 스트리머는 번거로운 수동 트윅 없이 다양한 메모리 예산을 자동으로 맞출 수 없습니다. 스트리머는 시각적 악영향 최소화를 위해 다양한 휴리스틱스로 어떤 텍스처를 감소시킬지 선택합니다.

최소한의 텍스처만 영향받을 것이며 그 효과는 국소적이라 여러 위치에서 희생되는 부분이 같지 않을 것입니다.

태그