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

카테고리

전체목록 (666)
참고사이트 (8)
Goal (4)
Travel (10)
My Life (105)
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)
Total343,756
Today5
Yesterday73

'최적화'에 해당되는 글 2건

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

Mesh 최적화

Optimizing/Unity / 2017.04.11 07:40

5.5.1p3 기준


하나씩 테스트를 해 보자.

Mesh Compression : 이 값을 높이면 메쉬 파일 크기가 줄어든다.

실제로 어떻게 차이가 나는건지 테스트 해 보자.

Mesh Compression : Off



Mesh Compression : High


뭔가 모습이 좀 달라진거 같기도 하고 아닌거 같기도 하고...

겹쳐서 보면 좀 움찔움찔 바뀌는 것 같음.


버텍스 갯수라던지 파일의 용량은 1도 안 줄어들었음.. 뭘까 분명 줄어든다고 했는데...

그런데 모양은 바뀐단 말이지....

여기 링크를 읽어보면 이렇게 적혀 있다.


"게임 파일에서 적은 공간을 차지하도록 메쉬와 임포트된 애니메이션 클립을 압축할 수 있다.

메쉬압축을 하려면, 메쉬를 선택 후 인스펙터에 있는 Mesh Compression을 Low, Medium 또는 High로 설정해라

메쉬와 애니메이션 압축은 양자화를 사용는데 이 말인 즉슨, 압축을 사용하면 공간은 덜 차지하지만

부정확성이 생길 수 있다는 것이다.

압축을 사용하고자 하는 모델에 어느정도 압축이 적합한지 테스트 해 봐라.

메쉬 압축은 단지 좀 더 작은 데이터 파일만 만들어 낼 뿐 실행시간에 더 적은 메모리를 사용하지는 않는다는 것을 알아야 한다.

애니메이션 키프레임 감소는 실행시간에 좀 더 작은 데이터 파일과 더 적은 메모리를 사용한다.

일반적으로 항상 이 기능을 켜둬라."


으잉? 데이터파일은 작아졋는데 메모리는 줄어들지 않는다고? 흐음...좀 이상하네.

아래 유니티 포럼에서 댓글을 좀 모아서 정리하자면 아래와 같다.


"이 기능은 실제로는 렌더링이나 메모리를 위한 기능이 아니라 게임 빌드 용량을 위한 기능이라고 봐야할듯하다.

즉, mesh 압축은 더 작은 메시로 만드는게 아니라 꼭지점/ 겹침 선을 제거한다.

메쉬 데이터를 저장하는 정밀도를 줄여 공간을 절약한다.

하지만, 메쉬 렌더링이 끝나면 이전과 같은 복잡성을 가지며 정확도는 약간 떨어진다.

그래서 파일 용량은 줄어들지만 렌더링시 퍼포먼스적인 그다지 이슈는 없다.


실제로 메쉬압축을 끄고 빌드한 경우 2.74메가, High로 한 경우 2.70메가가 나왔다.

우선 유니티 도큐먼트에서 말했던 더 작은 데이터 파일을 만들어 낸다는 말은 맞는말!! 

근디 좀 더 확확 해주지 0.04메가 줄다니..ㅜㅜ.


혹시나 해서 프로파일러로 메모리에 올라가는 크기를 찍어봤다.

메쉬 압축 Off : 349.3, 메쉬 압축 High : 248.2 가 나왔다.

메모리는 안 준다더니 줄어들었네??

물론 이건 위에서 만든 번들로 실행한게 아닌 로컬파일로 실행한 거긴 하지만 머 같지 않을까...


찜찜한 기분에 번들로 체크를 해 봤다.

메쉬 압축 Off : 349.3 메쉬 압축 High : 248.2

그래도 줄어들었다.


혹시나 해서 프레임 디버그로 정점갯수도 찍어봤지만 메쉬 압축을 Off로 하든 High로 하든 결과는 같았다.

그래서 내가 테스트 한 결과는 아래와 같다.

메쉬 압축 Off : 파일 용량(2.74 MB), 메모리(349.3 KB)

메쉬 압축 High : 파일 용량(2.70 MB), 메모리(248.2 KB)

테스트 환경 : pc, assetbundle. 유니티 프로파일러, 유니티 프레임 디버거 사용.


유니티 도큐먼트랑은 결과가 조금 다르게 나왔다.

내가 해석을 잘못 한걸까? ㅜㅜ.

유닛히에게 문의 좀 해봐야겠다.

(실제 테스트는 위 사진처럼 유니티의 예제 모델이 아닌 프로젝트 모델로 하였지만

글을 공개로바꾸기 위해 유니티 모델 사진으로 수정했슴.)


Read/Write Enabled : 런타임에 mesh 쓰기가 가능하도록 메모리에 복사본이 생성한다.

이 옵션을 끄면 유니티가 게임의 mesh 데이터를 언로드 할수 있기 때문에 메모리가 절약된다.

하지만 런타임에 비균등 스케일로 메쉬를 스케일링 또는 인스턴스화 하면 이 기능을 켜야하는 경우가 많다.

비균등 스케일링은 mesh 데이터를 메모리에 유지해야 하기 때문이다.

런타임에 MeshColliders를 만들고자 할 경우에도 마찬가지이다.


Optimize Mesh : 메쉬의 삼각형 순서를 결정한다.

이 기능을 사용하면 메쉬가 더 빨리 디스플레이 되며 로드시간이 줄어든다.

내부적으로 정점 캐시 영역에 대한 삼각형을 최적화 한다.


Import BlendShapes : 모프타겟 또는 정점 애니메이션.

자세한 내용은 이곳을 참고하자.

안쓰면 꺼두자. 


Normal & Tangents : Normal의 계산여부

이 옵션을 None으로 하면 게임크기가 줄어들고 Tangents 기능이 자동으로 꺼진다.

Import가 기본옵션이며 파일에서 법선을 임포트 한다.

Calculate는 Smoothing angle에 따라 법선을 계산한다.

None은 법선을 해제하므로 메시가 매핑된 법선을 사용하거나 실시간 라이팅의 영향을

받고 있는 법선인 경우는 사용하면 안된다.

쓰지않으면 None으로 설정하자.


Tangents : 탄젠트와 종법선 계산여부.

이 옵션은 위의 Normal & Tangents의 하위옵션이다.

Import는 파일에서 탄젠트와 종법선을 가져온다.

Calculate는 탄젠트와 종법선을 해제한다.

None은 탄젠트와 종법선을 해제하는데 메쉬에는 탄젠트가 없기에 법선매핑 셰이더로 사용할 수 없다.

쓰지않으면 None으로 설정하자.


Reference Link

- Mesh compression - what does it actually do?

- Does mesh compression increase performance of Unity3D games?

- Reducing the file size of your build

- Mesh

- Model

- Animation BlendShapes

-

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

MaterialPropertyBlock  (0) 2017.06.27
Mesh 최적화  (0) 2017.04.11
Dynamic Batching이 효율적일까?  (0) 2017.03.31
유니티 텍스처  (0) 2017.03.22
animation 최적화  (0) 2017.03.04
유니티에서의 메모리 관리.  (0) 2017.01.13
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 붕대마음

댓글을 달아 주세요

최근에 달린 댓글

최근에 받은 트랙백

글 보관함