animation 최적화

반응형

케릭터에 붙어있는 애니메이션이 많을수록 케릭터 로딩이 느려진다.

한 스테이지에 케릭터가 10개가 나온다고 가정하고, 각 케릭터가 가져야 할

애니메이션 갯수가 영웅일 경우 20개, 적군일 경우 10라고 할 경우,

애니메이션 용량이 3메가라 가정해서 영웅 5명의 애니메이션은

 5*20*3 = 300메가....헐...

적군 5명은 5*10*3 = 150메가....헐....

이건 좀 말이안되는듯..내가제대로 계산한거 맞음??? 후덜덜.....


그래서 애니메이션 최적화를 시도해보자!

이미 이 주제에 대해서는 많은 분들이 좋은 팁을 알려주셨으니 참고하면 되고

내가 할 이야기는 scale에 관한 내용이다.


최적화를 할 타겟 파일을 보자.

5메가가 넘는 엄청난 녀석이다.

엄청나게 많은 애니메이션을 하겠지 뭐....

유니티에서 애니메이션 창을 열어 왜 이렇게 용량이 큰지 살펴보다보니 우선 당연히 

플레이 타임이 긴 애니메이션임....그래그래..그건 이해가 되는데 세번째 사진을 보면

position이나 rotation은 이해가 가지만 scale?? 이건 값도 없는데 왜 들어가 있지..

그냥 1인걸 보증하기 위해서인가..??

유니티의 퍼포먼스 및 최적화 꿀팁에 보면 이렇게 나와있기도 하고....

그래서 과감히 scale을 삭제삭제..

용량이 5.21에서 1.49로 거의 70%가 줄었다.....

머지...? 너무 많이 준거아냐...난.그냥...2~30%만 줄어도 감사요~! 할려고 했는데.....

물론 scale 말고도 필요없어보이는걸 좀 제거하긴 했지만....


애니메이션 테스트를 진행해 보니 역시나 잘 나온다.

그래서 과감히 결정.

빠른 로딩을 위해 모든 애니메이션에서는 scale을 제거하고

특정 타임때 필요한 scale animation은 추가 script나 shader에서 지원.


AnimationCurve에 propertyName으로 체크하긴 했는데 모르는 이름도 있어서

적당히 대충했다. Nub이나 Editor 이런건 뭐지.. 필요없을 거 같은데...


2017.03.12 추가 테스트

아래 AnimationUtility.SetEditorCurve makes clip file size bigger?  에서 아래와 같은 글을 읽었다.

이 아저씨 말로는 짜투리정보는 에디터에서만 그런거고 실제로  빌드하면 알아서 다 제거해 준다고 한다.

그리고 inspector에 실제 애니메이션 메모리 크기가 보인다고 한다.

그런데 난 왜 안보이지? 보이지 않아서 추가 테스트를 해봤다.


최적화 전 : 68개의 파일, 총 66메가.

최적화 후(scale, editor 관련 제거) : 68개의 파일, 총 51.9메가

이렇게만 보면 꽤나 많이 절약된 걸로 보인다. 

이제 이걸로 번들을 뽑아보았다.

최적화 전 번들파일은 4.7메가, 최적화 후 번들파일은 4.4메가였다.

물론 이 번들파일에는 애니메이션 이외에도 여러가지가 들기는 하지만

0.3메가가 줄어들었다는건 어느정도 의미가 있다고 생각한다.


그리고 인스펙터는 아니지만 프로파일러에서는 애니메이션 클립의 메모리가 보인다.

최적화 전 : 670kb


최적화 후 : 329.4kb


프로파일러상에서도 용량이 줄었다.

그렇다면 내가 수행한 애니메이션 최적화가 효과가 있다는거 아닐까?


추가 용량을 줄일려면 유니티 메뉴얼 "FBX 임포터 관련 문서"를 참조해서 Rotation Error와 Position Errror

줄이는 것도 한 방법이다. 


애니메이션을 임포트할때, 모델을 IK노드는 FK안으로 구워지므로 유니티에서는

IK노드가 전혀 필요가 없다.

하지만 모델에 이 IK노드가 남아있다면 이 노드들이 애니메이션에 영향을 안 주더라도 

CPU오버헤드를 유발시킨다.

유니티나 모델링 툴에서 IK노드를 지울 수 있다.

이상적으로는, IK와 FK 하이라키를 모델링 하는 동안에는 따라 나누어 관리해야 나중에 지우기 쉽다.


버전을 올리고 나서 기존에 AnimationClipCurveData API 쓰던걸 버전문제 때문에 EditorCurveBinding으로 

바꾸는 작업을 했는데 용량이 더 커진다.

GetCurveBindings와 GetObjectReferenceCurveBindings 둘다 사용해 봤는데 마찬가지.

뭔가 내가 제대로 못하고 있는건지...

결과물이 마음에 들지 않기때문에 폐기 관련 경고는 그냥 무시하기로....


Reference Link

- 영웅의 군단의 테크니컬 아트

- 애니메이션 커브의 사용

- 애니메이션 퍼포먼스 및 최적화

AnimationUtility.SetEditorCurve makes clip file size bigger?

- 유니티 메뉴얼 FBX 임포터

- unity doc, modeling characters for optimal performance

- Unity3D Performance Optimization Codes

- unity doc, mesh importing

-

'Optimizing > Unity' 카테고리의 다른 글

Dynamic Batching이 효율적일까?  (0) 2017.03.31
유니티 텍스처  (0) 2017.03.22
유니티에서의 메모리 관리.  (0) 2017.01.13
Unity sound setting  (0) 2017.01.10
gc.markdependencies  (0) 2016.09.07
TAGS.

Comments