luce in altisBLUE SKY

category Photo

Blog


2017 언리얼 서밋 프리미엄

 

아래 내용은 회사 컨버런스 정리글을 펌한 내용.

 

언리얼 엔진 4 셰이더, 더 깊이 이해하기

셰이더

  • 언리얼의 셰이더는 USH(Unreal Shader Headers)와 USF(Unreal Shader Files)로 구성됨
  • HLSL 코드로 작성되는 USF는 FShaderType으로 관리됨
  • Global / Material / MeshMaterial 3가지 타입이 존재함
  • FShaderType이 컴파일되어 FShader 셰이더 인스턴스가 됨
  • 메시특성은 VertexFactory를 통해 생성되는데, 현재는 커스터마이징 가능한 인터페이스를 제공하지 않음

머티리얼

  • Material의 각 노드들이 번역되면서 독립된 usf 코드로 컴파일됨
  • 커스텀 노드는 HLSL코드를 직접 작성할 수 있는 노드지만, 코드최적화가 수행되지 못하므로 가급적 안쓰는게 좋음

UE4 Shader Plugin

셰이더 플러그인으로 GlobalShader를 커스터마이징하는 실슴(?)
요약하자면 언리얼 셰이더 개발 문서의 내용이 된다.

모바일 오픈월드 아트 컨텐츠 제작 및 최적화

  • 아트 리소스 다이어트 방법들을 소개. 뻔하다
  • 모바일에서 랜드스케이프 사용시 컴포넌트 사이즈를 많이 줄임
  • 랜드스케이프 텍스쳐 수를 3개 이하로 해야 GLES 2.0 디바이스에서 제대로 돌아감
  • 스태틱 메시들은 HLOD를 적용함

꼭 알아두어야 할 언리얼 엔진 4 모바일 기능 A-Z

성능 개선하기

  • 셰이더 캐시 사용하기 -> 셰이더 히치를 줄임 (첫 플레이시는 어쩔 수 없다)
  • 모바일 자율시점 MMO라면 Precomputed visibility volume을 사용하는게 득
  • 머터리얼에서 Static Switch 쓰면 패키징시 머터리얼 종류가 늘어나니 남용 금지
  • Material instance 최대한 활용하기
  • 높은 LOD에는 Material baking으로 GPU연산 줄이기

Slate UI 최적화

  • 2D UI들은 배치프로세싱됨
  • 동일 머터리얼을 최대한 활용
  • 동일 Layer ID에 배치하기
  • Invalidation Pannel로 캐시 최대화하기

언리얼 엔진 4 최적화와 퍼포먼스 업데이트

Shader Library

  • 중복된 셰이더들 (머터리얼 노드들), 메모리에 중복 로딩되지는 않지만 디스크에 중복되어 패키징됨
  • Shader library는 머티리얼 노드를 usf코드로 바로 번역하는 대신 셰이더 파일 key로 매핑시켜둠
  • 그 후 머티리얼 사용시 매칭되는 key의 usf를 컴파일 & 로딩
  • 전체 usf파일 사이즈가 1/5 수준으로 줄어듦
  • DLC에 사용되는 머티리얼에는 지원 불가
  • 4.18부터 비동기 셰이더 로딩이 지원됨

LLM (Low Level Memory Tracker)

  • 게임에서 할당하는 모든 메모리를 트래킹
  • 스코프 태그를 붙이면 스코프 내 할당되는 메모리에 태깅
cpp
{
    LLM_SCOPE(LLMTag::Material)
    //코드들
}
  • 태그를 붙이지 않아도 Untaged 메모리로 트래킹은 됨
  • -LLM 옵션으로 게임 실행, stat llmfull 콘솔 명령으로 정보를 볼 수 있음
  • -LLMCSV 옵션으로 실행하면 매 프레임 메모리 트래킹 정보를 csv파일로 덤프떠줌

PGO (Profile Guided Optimization)

  • 컴파일 최적화 기법
  • 다음의 과정으로 최적화가 진행됨
    1. PGO관련 코드를 삽입 후 컴파일
    2. 플레이 -> 플레이 기록 DB가 생성됨
    3. DB를 분석해 코드를 최적화
    4. 다시 컴파일
  • 대략적인 기능들
    • inline 최적화
    • 레지스터 최적화
    • 분기문 최적화
    • size / speed trade-off 함수별 최적화
    • function layout 최적화

네트워킹 최적화

  • 에픽은 PNBR 개발하면서 대규모 멀티플레이어 게임 처음 만들어봄
  • Network relevance view mode 사용해서 디버깅
  • replication 코드에 최적화 할 요소들이 많았다
    • serialization 코드에 TArray 동적할당 하던 부분들 TInlineAllocator 사용으로 동적할당 최소화
    • 클라이언트가 인지중인 서브레벨을 서브레벨당 RPC한 번 보내던 걸 서브레벨 배열을 보내도록 변경
    • 핑을 끔
    • replicate 되는 구조체들 Bit Field로 다이어트
    • 그외 이것저것..
  • 자주 쓰이는 액터/컴포넌트들 (StaticMeshComponent, SceneComponent, Character 등등) 다이어트
  • 이런것들이 모두 4.18/.19 릴리즈에 들어올 예정

언리얼 엔진 4 업데이트와 로드맵

4.18 릴리즈 노트의 내용을 장황하게 설명

'게임 > 프로그래밍' 카테고리의 다른 글

C# 8.0 Switch Expression  (0) 2020.06.01
Index & Range  (0) 2020.05.26
자신의 컴퓨터가 듀얼 코어 이상이라면...  (0) 2009.08.26
[STL] Vector 정렬..  (0) 2009.07.22
이놈의 LUA..  (0) 2009.06.26