More Related Content Similar to 게임 애셋 스트리밍 패치(20) 게임 애셋 스트리밍 패치3. 게임 애셋
game asset
게임에 들어가는 그래픽, 사운드, 음악, 텍스트 등 유저에게 보여지는 것들
http://gamemook.com/entry/게임용어-asset
일단 데이터 파일 정도의 의미로…
8. 기존 온라인 게임 패치
1. 모든 파일이 최신일까?
아니라면 패처 실행
2. 패처가 모든 파일을 최신 버전으로 맞추고
3. 다시 게임 실행
패처 옵션으로 ‘마지막으로 패치
되는 파일’ 따위를 설정할 수 있으
면 그 파일에서 버전을 읽어서, 서
버가 제공해주는 버전과 비교하
면 간단
9. 스트리밍 패치
작동에 필요한 최소한의 파일을 우선 받는다
무슨 파일이 필요할지 어떻게 알지?
게임클라이언트가 패처 기능을 포함
게임 도중에도 다운로드 작업 필요
목록을 사람 힘으로 만들지는 말자;;;
11. 이 파일이 최신 버전인가?
• 패치 준비 단계에서 모든 파일을 요약
• 이름, 크기, CRC, svn 리비전
12. …
herocar.psd.data 15253 8b4999b8 4477
herocar.wsj 7142 8ecccbfb 4880
hidden_cannon.wsj 3152 221b695c 4117
hit.psd.data 15260 dad0af08 2879
hit.wsj 3292 c1030c3d 4836
hit01_effect.wsj 4571 330df761 4915
Hit_Arrow.wav 40322 e5782685 4717
hit_blood_00.wsj 4725 54d99432 6236
hit_blood_00_전연령.wsj 4859 0750b701 6342
Hit_Both.wav 37400 29d0ca43 4717
Hit_Claw.wav 22572 809f00a8 4717
Hit_Claw_2.wav 39696 d60a02a1 4717
Hit_Hammer_1.wav 13898 92be7f88 5044
Hit_Hammer_2.wav 13812 b81b8942 5044
hit_lightning.wsj 2780 33145aad 4729
Hit_Normal_1.wav 10694 5efd41cc 4717
Hit_Normal_2.wav 19376 8c26fd15 4717
Hit_Normal_3.wav 13906 a77f4b30 4717
hit_slash_00.wsj 1471 01d49c41 4849
hit_slash_01.wsj 1464 7ecae13c 4849
hit_slash_02.wsj 1475 188aeb09 4849
Hit_Wet_1.wav 27760 f2c492e7 4717
Hit_Wrench_1.wav 22118 726af8f2 5044
Hit_Wrench_2.wav 24512 8e2a5576 5044
Home-Default.dhmb 1173 63cccdf0 7324
Home-Default.luab 221 ef6ff272 5483
home_bg.psd.data 462976 db2d4059 4568
…
목록 파일 (수십KB)
버전 파일 (수십B)
모든 파일 (수십MB)
http://deskhz.dn...
44748
a418672e
7472
13. 파일 최신 버전 알아내기
클라이언트 뜰 때 버전 파일을 받는다
목록 파일이 없거나 변경되었는가?
• 목록 파일을 갱신하고,
• 모든 파일들의 크기, CRC, 리비전을 검토
• 달라진 게 있으면 삭제한다
• 이제부터는 파일이 없으면 받으면 됨!
17. 지금 필요한 파일
A. 항상 필요한 파일
특정 확장자 (exe, dll, lua, ui)
별도의 목록 (Seed.lua) 에 있는 파일
B. 지금 시작할 스테이지 파일
0001-Town1.map / lua
C. 지금 필요한 파일들이 의존하는 파일
18. 애셋 의존성의 예
스테이지 파일
배경 그림
스테이지에 나올
몬스터
몬스터
애니메이션
몬스터 그림
몬스터 이펙트
애니메이션
BGM
몬스터 이펙트
그림
몬스터 이펙트
사운드
20. 의존성 검사
말이 쉽지…
• 게임의 다른 부분과 심하게 얽히는 경향
모든 애셋 포맷을 ‘알아야’ 하니까…
• 지속적으로 비용이 발생한다
못하겠어요ㅠㅠ 는 아니고 아 귀찮아ㅡㅡ 정도
22. 다운로드
<메인 스레드>
필요한 파일 이름을
큐에 넣는다
다운로드 작업이 모두 끝날
때까지 기다린다
<다운로드 스레드> (x1~10)
큐에서 파일 이름을 꺼낸다
다운로드한다
추가 의존성이 발견되면
그것도 큐에 넣는다
23. 기타 이슈
• 개발용 버전
• 가상 파일 시스템
• 실행 파일 교체
• 예외 상황 대응
• 플레이어 아바타
• 안 쓰는 애셋 찾기
24. 개발용 버전
스트리밍 패치 쓰지 않습니다 당연히..
• 똑같은 인터페이스를 가진 다른 클래스 사용
의존성 검사 부분에서 실수하면,
• 개발 버전에선 잘 작동
• 릴리스 버전에서 파일 없다고 죽는다!
디버깅하기 훨씬 귀찮다
25. 개발용 버전
실수하는 케이스:
• ‘항상 필요한 파일’ 목록에 안 넣고,
파일 이름 직접 써서 애셋 로드
• 애셋 종류 추가하거나 포맷 바꿨는데
의존성 검사 코드 수정 안 함
해결책:
• 준비 안 된 파일 읽으려 하면
개발용 버전에서도 인위적으로 오류 나게 함
26. 실행 파일 교체
별도의 exe를 추가로 포함
DesktopHeroes.exe.patch
→ DesktopHeroes.exe
지금은 그냥 넥슨패처 씁니다.
넥슨닷컴에 붙이려다 보니…
27. 가상 파일 시스템
단일 서브시스템으론 가장 까다로웠던 부분
• 임의 파일 추가/삭제가 빠를 것
• 여러 스레드에서 동시 읽고 쓰기 가능할 것
• 온갖 실패 상황에 대해 견고하게 동작할 것
저널링, Heap 메모리처럼 관리, Overlapped I/O 사용
28. 예외 상황 대응
스트리밍패치도 결국은 패치
넥슨패처보다 불안정 N년간 온갖 상황을 겪으며 단련되었을 테니…
‘이럴 리 없는데’ 싶은 덤프 보고가 자꾸 들어옴
계속 수정 중
29. 플레이어 아바타
언제 나올지 예측 불가
• 필요할 때 요청하고 완료될 때까지 기다릴 수 없다
• 지금은 모든 아바타를 ‘항상 필요한 파일’ 에 넣고 있음
평범하게 백그라운드 로딩하면 됨
• 일단 더미 그림 올려 놓고 받아지면 교체하기
30. 보너스
의존성 검사 코드를 활용해서
• 어떤 애셋을 어떤 애셋이 참조하는지
• 안 쓰는 애셋은 무엇인지
찾는 툴을 쉽게 만들었음