2. 도시 스트리밍 초기 요구사항
• 거대한 도시
• 구역별로 구분된 게임 기능
• 디자이너들이 구역별로 분할해서 작업하기
원함
• 배틀 등 모든 레벨 이동을 seamless 하게
3. CBT 버전의 접근 방법
• Unreal의 기본 레벨 스트리밍 기법 사용
• 레벨 파일 단위 스트리밍
• 현재 레벨에 겹쳐서 로드됨
• Unreal의 기본 텍스쳐 스트리밍 사용
• 시점에 기반한 텍스쳐 해상도 자동 조절
4. CBT 버전 문제점
• I/O가 느리거나 플레이어 이동속도가 빠르면
텅 빈 구역을 보게 됨
• 메모리 사용량 및 로딩 속도가 구역마다 현저
히 다름
• 일부 구역에서 렌더링 퍼포먼스 문제
• 간헐적 멈춤 현상
• 시각적인 불연속성
• 스트리밍에 효율적인 구역 나누기 어려움
5. CBT 1차 이후 수정 요구사항
• GTA 스타일 스트리밍의 필요성
• Loading LOD concept
• 건물 단위 스트리밍
• 렌더링 최적화를 위한 LOD
• I/O 속도에 관계없는 게임 플레이
9. LOD Group
• 큰 건물이나 구역은 작은 부속 메쉬들로 이루
어져 있음
• 낮은 수준 LOD에서는 구역 전체를 대표 메
쉬 하나로 렌더링
• 에디터에서 부속 메쉬들에 대한 LOD Group
메쉬를 지정
• 거리에 기반하여 부속 메쉬들 스트리밍
(Batch request)
• 전체 로드 이후 부속 메쉬들 렌더링
10. Unreal Object Loading 기본 사항
Unreal UObject : serializable entity
UObject 로드 절차
1. Load Package file header
2. Construct UObject instance
3. Load UObject data (serialization)
4. PostLoad
11. Object Streaming 초기 구현
스트리밍 대상 건물이 사용하는
StaticMesh, LightMap 정보 부터
serialization 작업 시작
1. Construct UObject instance
2. Load UObject data
3. PostLoad
4. 1번부터 반복
12. 초기 구현
문제점
• 잦은 멈춤 현상 : UObject load의 I/O block
(seek+read)
• 느린 스트리밍 속도
해결책
• Async I/O
• 미리 읽어둠 (precache)
• 유관 데이터들을 인접하게 만듦
• (압축, seek free loading은 제외)
13. Object Streaming 개선 버전
• Object Streaming
1. UObject들의 로딩 순서 예측
2. Async I/O에 예측된 object들 precache 요청
3. Construct UObject instance
4. Load UObject data from precached data (staged
version)
5. PostLoad
14. Object Streaming 개선 버전
• Precache 순서 예측 : 패키지 세이브 시에 순서 저장
• I/O Precache
• 각 UObject data 단위로 디스크 읽기 요청 Queue
• 최대 N개의 요청들 저장
• 로딩의 모든 단계에서 timeout 처리 가능해야 함
• State mgmt.
• Staged Serialization
• Batched Streaming concept (LOD Group)
• Atomicity
• Efficency
15. Streaming Process
Script
Prop.
Mesh
Game
…
Play
Priority Filter
Precache Request
Finish Construct I/O
Thread
~10ms/frame
Stream
PostLoad Serialize
16. Optimization
• Streaming Toggle view
• 메쉬 스트리밍 우선 순위
• 화면상의 크기
• 카메라 방향
• (PVS?)
• Texture
• 가장 많은 데이터
• 초기에 낮은 해상도만 로드
• 메쉬 로드 종료 이후 높은 해상도 로드
19. 현재까지의 결과 - 노스탈로니아
• 전체 로드 크기 2GB
• 전체 메쉬 1200여개
• 전체 텍스쳐 1600여개
• 초기 로드 메쉬 400여개
• 초기 로드 텍스쳐 600여개
• 메모리 사용량 400MB
20. Streaming 요구사항 추가
• 점점 증가하는 도시의 캐릭터들
• SkeletalMesh
• Texture
• Animation
• Sound
• 수많은 방어구, 무기
• 도시 : 시야 기반 스트리밍
• 배틀 : listen server만 스트리밍
21. Streaming Support in UnrealScript
• Script 수준의 streaming syntax 추가
var StaticMesh lazyload{LoadInfo} MyMesh
function LoadLazyLoadable(name PropName, bool
AsyncLoad)
function UnloadLazyLoadable(name PropName)
• Streaming Ready!
22. 교훈
수치 데이터의 중요성
eXtream Programming idiom
“You won’t need it” ??
명확한 게임 플레이 요구사항 고려