블로그 이미지
자신의 단점을 메꾸는 것을 단(鍛)이라 하고 자신의 강점을 갈고 닦는 것을 련(鍊)이라 하여, 두가지를 합친 것을 단련이라고 부른다. 붕대마음

카테고리

전체목록 (665)
참고사이트 (8)
Goal (4)
Travel (10)
My Life (104)
Game (35)
Game Review (7)
Game Plan (0)
Books (5)
English (1)
Optimizing (12)
Study (217)
유용한 것들_etc (44)
유용한 것들_func (20)
Unity (48)
Unreal (87)
작업장 (54)
RenderMonkey (6)
정리요망 (1)
따라잡기 시리즈 (0)
링크용 (0)
Total341,593
Today114
Yesterday125

'Optimizing'에 해당되는 글 2건

  1. 2017.03.04 animation 최적화
  2. 2017.02.28 Tiling와 Offset을 활용한 2개의 압축텍스처 최적화

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

한 스테이지에 케릭터가 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
animation 최적화  (0) 2017.03.04
유니티에서의 메모리 관리.  (0) 2017.01.13
Unity sound setting  (0) 2017.01.10
gc.markdependencies  (0) 2016.09.07
Posted by 붕대마음

댓글을 달아 주세요

알고있기로는 압축텍스처를 쓸 경우 aos는 2의 승수로, ios는 걍 무조건 2의승수 정방으로 해야 한다.

그래서 aos는 가장 가까운 2의 승수, 120x500 이면 128x512로 변환되지만 ios는 512x512가 된다. 

aos와 ios버전의 텍스처를 따로 관리할 게 아니라면(사실 이건 프로젝트가 커질수록 좀 힘듬..)

처음부터 텍스처 관리를 잘 해줘야한다.


우선적으로 생각해야할 부분이 aos에서 ETC2를 사용할까 말까에 대한 결정이다.

ETC2 자체로는 ETC1을 대체하기 위해 나온 개량형이다.

게다가 용량도 작고 알파까지지원된다!!!.

그런데왜 고민을 해야하는 걸까?

우선 모든 aos폰이 etc2를 지원하는것이 아니기 때문이다.

etc2는 open gles3.0에서 돌아간다.

그렇다면 그 es2.0 버전에서는 어떻게 되는가? etc2로 설정해도 잘 나오던데!!

이럴경우 기기에서 지원되지 않는 텍스처 압축방식이라 비압축 rgba32형식으로 압축된

텍스처와 함께 메모리에 저장되고, 이러한 경우 텍스처압축을 푸는 만큼 시간도 걸리고

메모리 공간도 더 많이 필요하게된다.

즉, 지원은 하지만 es2.0대 디바이스에서는 하드웨어적으로 더 손해다.


그래서 나는 아직은 etc1을 더 선호하고, 만약 알파가 필요하다면 etc1 두장을 사용한다.

하나는 rgb를, 나머지 하나에는 rga에 알파값을 넣어서 사용하면 꽤 훌륭한 퀄리티를 볼 수 있다.

이에 대한 내용은 아래 링크를 참조하면된다.


여기서 말하고자 하는 것은 etc2를 사용하지 않고 rgba32대신 etc1 두장으로 

사용할 수 있는 리소스(2의 승수)에 한해서, 거기에 이 두장을 합치면 정방이 될 경우에

Tiling와 Offset을 활용하여 작업을 할 수 있다는 것이다.


이미지 1 : 256x512, etc1, color texture

이미지 2 : 256x512, etc1, alpha blending용 texture

알파블렌딩 셰이더를 만들어 인자로 두 텍스처를 각각 넣어줬었다.

하지만 이렇게 하면 텍스처로 두장을 관리해야 하고 ios에서는 512x512 2장이 되어버린다.

물론 이 방식이 etc2와 pvrtc를 사용한다면 한장으로 가능하겠지만 etc2를 사용하지 않는 경우

etc1두장으로 가야하고 이러면 ios에서는 크게 혜택을 보지 못하기 때문에 

이미지 1과 이미지 2를 합쳐서 512x512를 만들고 아래와 같이 설정해서 사용한다.

위 Particle Texture와 Mask 텍스처는 하나의 이미지 이고 color 부분은 x가 0~0.5,

아래 mask 부분은 0.5~1.0으로 사용한다.

이미지 1,2와 이 둘을 합쳐 실제 사용하는 이미지3은 공개가 힘드므로 패스.

공개가능한 예제이미지는 만들기 귀찮아서..ㅜㅜ.


Reference Link

- unity, non power of 2

- 유니티에서 etc2 텍스처 사용 시 애매한 사항들

- rgba32 bit texture를 etc 4bit texture 2장으로 사용하기

-

Posted by 붕대마음

댓글을 달아 주세요

최근에 달린 댓글

최근에 받은 트랙백

글 보관함