Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
M2프로젝트의애니메이션 로딩 전략    ㈜넥슨    GTR팀    백승엽
자기소개신규개발3본부 1실 GTR팀             과장      프로그래머 14년차         넥슨 6년차         남편 9년차         아빠 6년차
자기소개
리소스 현황????+ 모션????+ 클립약 ???MB이 PT의 모든 비교 수치는현재의 리소스셋을 사용해서테스트한 것입니다
처음에는클라이언트 기동시에 모두 로드 엔진을 만들면서 게임을 만드는 상황   리소스 관리가 없었음 로딩랙은 피하고 싶었음 리소스 양이 아직 많지 않았다
.Clip텍스트 데이터 읽을 수 있는 포맷 디버깅에 도움
개발이 진행되면서리소스가 증가초기 기동시간의 압박이 먼저 왔다
바이너리 클립
.bClip클라이언트의 클립 구조체를 거의 그대로 덤프 파일 사이즈 감소 파싱 불요   로딩 속도 향상
클립 리덕션두 프레임을 잡아서 선형보간-> 그 사이 프레임들의 실제값과 비교-> 오차가 최대가 되는 프레임을 골라냄-> 모든 오차가 기준치 이하가 될 때까지 반복
클립 리덕션10     109      98      87      76 65 54 4      33      22      11      00             1    2    3   4       5      ...
클립 리덕션 설정기준치는 설정 파일에서 읽어옴 퀄리티를 손상시키지 않는 선에서 적절히 개별 모션 단위 설정도 가능
데이터 압축32bit float를 16bit int로 저장메모리 상에서도 압축된 상태  로드할 때가 아닌 참조할 때 해독
벡터 압축트랜슬레이션/스케일(= 벡터)트랙 최소값               트랙 최대값            트랙 중간값 INT_MIN             INT_MAX              0
쿼터니온 압축로테이션(= 쿼터니온) 회전값을 상대 회전으로 변환 쿼터니온 -> 벡터
바이너리 클립의 성과                   파일크기(MB)                로딩시간(초)  클립       바이너리클립
인터미디엇 폴더
인터미디엇 폴더익스포터에서는 클립을 익스포트바이너리 클립은 빌드 서버가 빌드 클립의 장점을 유지하고 싶었음그럼, 애니메이터의 동작 확인은?
인터미디엇 폴더인터미디엇 폴더 중간 단계의 리소스가 위치하는 곳   리테일에는 포함되지 않는다클립을 로드하는 설정이 존재 클립 로드시 실시간으로 리덕션   애니메이터가 리덕션 설정치 조정 가능
인터미디엇 폴더클립과 바이너리 클립 어느 것을 로드? 무조건 클립 우선   어느 것을 로드할지 판정에 시간 소모      더 느려져 버린다 애니메이터 PC의 클립은 자신이 작업한 것
클립 번들
클립 번들초기 기동시에 로드모든 클립을 포함각 클립은 격하게 리덕션 되어 있다 애니메이션 품질의 저하를 감수   오동작으로 보이지는 않는 선
클립 번들의 동작처음으로 클립이 요청되면   번들에서 로드해 둔 클립을 재생하면서   백그라운드에서 클립을 로드한다로드가 끝나면 그 때부터 로드한 클립을 재생
클립 번들의 리덕션번들 리덕션   일반 리덕션
클립 번들의 리덕션처음 n 프레임은 리덕션하지 않는다 처음 n 프레임 동안은 고품질 이 구간을 재생하는 동안 로딩되면 참 좋겠네   기대만큼 잘 안되더라
클립 번들의 성과                      초기 로드 양(MB)                   초기 기동시간(초)   번들 이전           번들 도입여전히 애니메이션 로드랙이 없다!
개발이 진행되면서리소스가 증가이제는 메모리의 한계가 왔다
상식적인 접근필요한 것만 로드한다 뭐가 필요한지 어떻게 알아낼 것인가필요 없어진 것은 제거한다 뭐가 필요 없어졌는지 어떻게 알아낼까
어떻게 할 것인가이 부근에는 A몬스터가 나타난다 이 몬스터의 모션을 로드하자!   몬스터 등장 전에 로딩이 끝날 것인가? 이 정보는 어떻게 얻을 수 있을까?   사람의 개입 없이 자동이면 좋겠다
여기서 아이디어ex)몬스터 A가 맞은 다음에는  서 있는 자세로 돌아가거나  맞고 넘어지거나  맞고 날아갈 것이다애니메이션 간의 순서 관계를 이용할 수 있다!
클립 로드 그룹
액티베이터 클립연속동작의 시작점이 되는 클립들클립 번들에 포함 기동시에 번들 버전이 로드되어 있음
클립로드그룹액티베이터가 요청되면 같이 로드하는 클립들클립번들에 포함되지 않음 필요할 때 로드되어 있다고 보장은 안됨 로드그룹 튜닝으로 괜찮은 수준으로 동작 중
클립로드그룹의 빌드  ActionSlot       Slot-LoadSlot Table  ActionSet       Anim-LoadAnim TableAnim-Clip Table    Clip-LoadClip Table
클립로드그룹의 성과                   초기 로드 양(MB)                초기 기동시간(초) 번들 도입         로드그룹
클립 언로드
클립 언로드클립 단위 레퍼런스 카운트로드그룹 단위 레퍼런스 카운트 같은 로드 그룹 내의 다른 클립이 사용 중 -> 이 클립도 다시 사용될 가능성 높다
클립 언로드모든 소속 클립의 레퍼런스 카운트가 0 로드그룹의 레퍼런스 카운트가 0   그룹이 언로드 가능한 상태클립이 다른 그룹에도 속했을 수 있다 소속된 그룹 모두가 0이야 클립이 언로드 가능
클립언로드레퍼런스 카운트가 0이 되면 바로 언로드하지는 않는다 현재 메모리 사용량에 따라서 언로드   상식적인 전략   M2에서는 아직 튜닝 필요한 부분
Q&A
Upcoming SlideShare
Loading in …5
×

백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011

6,388 views

Published on

비공개 발표를 외부 공개용으로 재편집한 자료입니다.

Published in: Technology
  • Be the first to comment

백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011

  1. 1. M2프로젝트의애니메이션 로딩 전략 ㈜넥슨 GTR팀 백승엽
  2. 2. 자기소개신규개발3본부 1실 GTR팀 과장 프로그래머 14년차 넥슨 6년차 남편 9년차 아빠 6년차
  3. 3. 자기소개
  4. 4. 리소스 현황????+ 모션????+ 클립약 ???MB이 PT의 모든 비교 수치는현재의 리소스셋을 사용해서테스트한 것입니다
  5. 5. 처음에는클라이언트 기동시에 모두 로드 엔진을 만들면서 게임을 만드는 상황 리소스 관리가 없었음 로딩랙은 피하고 싶었음 리소스 양이 아직 많지 않았다
  6. 6. .Clip텍스트 데이터 읽을 수 있는 포맷 디버깅에 도움
  7. 7. 개발이 진행되면서리소스가 증가초기 기동시간의 압박이 먼저 왔다
  8. 8. 바이너리 클립
  9. 9. .bClip클라이언트의 클립 구조체를 거의 그대로 덤프 파일 사이즈 감소 파싱 불요 로딩 속도 향상
  10. 10. 클립 리덕션두 프레임을 잡아서 선형보간-> 그 사이 프레임들의 실제값과 비교-> 오차가 최대가 되는 프레임을 골라냄-> 모든 오차가 기준치 이하가 될 때까지 반복
  11. 11. 클립 리덕션10 109 98 87 76 65 54 4 33 22 11 00 1 2 3 4 5 6 1 2 3 4 5 6
  12. 12. 클립 리덕션 설정기준치는 설정 파일에서 읽어옴 퀄리티를 손상시키지 않는 선에서 적절히 개별 모션 단위 설정도 가능
  13. 13. 데이터 압축32bit float를 16bit int로 저장메모리 상에서도 압축된 상태 로드할 때가 아닌 참조할 때 해독
  14. 14. 벡터 압축트랜슬레이션/스케일(= 벡터)트랙 최소값 트랙 최대값 트랙 중간값 INT_MIN INT_MAX 0
  15. 15. 쿼터니온 압축로테이션(= 쿼터니온) 회전값을 상대 회전으로 변환 쿼터니온 -> 벡터
  16. 16. 바이너리 클립의 성과 파일크기(MB) 로딩시간(초) 클립 바이너리클립
  17. 17. 인터미디엇 폴더
  18. 18. 인터미디엇 폴더익스포터에서는 클립을 익스포트바이너리 클립은 빌드 서버가 빌드 클립의 장점을 유지하고 싶었음그럼, 애니메이터의 동작 확인은?
  19. 19. 인터미디엇 폴더인터미디엇 폴더 중간 단계의 리소스가 위치하는 곳 리테일에는 포함되지 않는다클립을 로드하는 설정이 존재 클립 로드시 실시간으로 리덕션 애니메이터가 리덕션 설정치 조정 가능
  20. 20. 인터미디엇 폴더클립과 바이너리 클립 어느 것을 로드? 무조건 클립 우선 어느 것을 로드할지 판정에 시간 소모 더 느려져 버린다 애니메이터 PC의 클립은 자신이 작업한 것
  21. 21. 클립 번들
  22. 22. 클립 번들초기 기동시에 로드모든 클립을 포함각 클립은 격하게 리덕션 되어 있다 애니메이션 품질의 저하를 감수 오동작으로 보이지는 않는 선
  23. 23. 클립 번들의 동작처음으로 클립이 요청되면 번들에서 로드해 둔 클립을 재생하면서 백그라운드에서 클립을 로드한다로드가 끝나면 그 때부터 로드한 클립을 재생
  24. 24. 클립 번들의 리덕션번들 리덕션 일반 리덕션
  25. 25. 클립 번들의 리덕션처음 n 프레임은 리덕션하지 않는다 처음 n 프레임 동안은 고품질 이 구간을 재생하는 동안 로딩되면 참 좋겠네 기대만큼 잘 안되더라
  26. 26. 클립 번들의 성과 초기 로드 양(MB) 초기 기동시간(초) 번들 이전 번들 도입여전히 애니메이션 로드랙이 없다!
  27. 27. 개발이 진행되면서리소스가 증가이제는 메모리의 한계가 왔다
  28. 28. 상식적인 접근필요한 것만 로드한다 뭐가 필요한지 어떻게 알아낼 것인가필요 없어진 것은 제거한다 뭐가 필요 없어졌는지 어떻게 알아낼까
  29. 29. 어떻게 할 것인가이 부근에는 A몬스터가 나타난다 이 몬스터의 모션을 로드하자! 몬스터 등장 전에 로딩이 끝날 것인가? 이 정보는 어떻게 얻을 수 있을까? 사람의 개입 없이 자동이면 좋겠다
  30. 30. 여기서 아이디어ex)몬스터 A가 맞은 다음에는 서 있는 자세로 돌아가거나 맞고 넘어지거나 맞고 날아갈 것이다애니메이션 간의 순서 관계를 이용할 수 있다!
  31. 31. 클립 로드 그룹
  32. 32. 액티베이터 클립연속동작의 시작점이 되는 클립들클립 번들에 포함 기동시에 번들 버전이 로드되어 있음
  33. 33. 클립로드그룹액티베이터가 요청되면 같이 로드하는 클립들클립번들에 포함되지 않음 필요할 때 로드되어 있다고 보장은 안됨 로드그룹 튜닝으로 괜찮은 수준으로 동작 중
  34. 34. 클립로드그룹의 빌드 ActionSlot Slot-LoadSlot Table ActionSet Anim-LoadAnim TableAnim-Clip Table Clip-LoadClip Table
  35. 35. 클립로드그룹의 성과 초기 로드 양(MB) 초기 기동시간(초) 번들 도입 로드그룹
  36. 36. 클립 언로드
  37. 37. 클립 언로드클립 단위 레퍼런스 카운트로드그룹 단위 레퍼런스 카운트 같은 로드 그룹 내의 다른 클립이 사용 중 -> 이 클립도 다시 사용될 가능성 높다
  38. 38. 클립 언로드모든 소속 클립의 레퍼런스 카운트가 0 로드그룹의 레퍼런스 카운트가 0 그룹이 언로드 가능한 상태클립이 다른 그룹에도 속했을 수 있다 소속된 그룹 모두가 0이야 클립이 언로드 가능
  39. 39. 클립언로드레퍼런스 카운트가 0이 되면 바로 언로드하지는 않는다 현재 메모리 사용량에 따라서 언로드 상식적인 전략 M2에서는 아직 튜닝 필요한 부분
  40. 40. Q&A

×