아래 내용은 회사 컨버런스 정리글을 펌한 내용.
언리얼 엔진 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)
- 컴파일 최적화 기법
- 다음의 과정으로 최적화가 진행됨
- PGO관련 코드를 삽입 후 컴파일
- 플레이 -> 플레이 기록 DB가 생성됨
- DB를 분석해 코드를 최적화
- 다시 컴파일
- 대략적인 기능들
- 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 릴리즈 노트의 내용을 장황하게 설명