dnrkckzk 초보 유니티 개발자 개발하면서 겪는 어려움들을 해결했을 때, 인터넷 돌아다니는 흥미 있는 글 있을 때, 저장하고 공유하기 위한 공간.

카테고리

전체보기 (42)
뇌를 자극하는 C# 5.0프로그래밍 (9)
Unity Tip (30)
C# (1)
Total
Today
Yesterday

유니티 최적화

Unity Tip / 2018. 3. 13. 09:27

늘 그렇듯 쓸 데 없는 내용 이렇게 글을 남깁니다.

유명한 내용인데 유니티가 많이 업데이트 되면서 쓸모 있는지는 좀 더 검증이 필요하긴 합니다. 


코드 최적화

1. 유니티 객체들을 변수에 저장해서, 캐싱해서 사용하는것이 좋다고 합니다.


2. FindObject 계열 함수들은 매우 느리다. (미리 찾아서 캐싱)


3. Instanitate 와 Destroy 함수를 이용한 프리팹의 생성/해제는 비용이 크다

- 활성화/비활성화를 활용 -> 오브젝트 풀링


4. Update 함수보다는 Coroutine을 활용한다.


5. 나눗셈 보다는 곱셈이 몇 십 배 빠르다.


6. 박싱과 언박싱은 부하가 큰 작업이다.


7. magnitude 보다는 sqrMagnitude를 사용해서 비교한다. (제곱근 계산 x)


8. 삼각함수의 값은 상수로 저장하고, 사용하는 것이 좋다.


9. 문자열은 readonly 혹은 const 키워드를 사용하여, 가비지 컬렉션으로부터 벗어나도록 한다.


10. 가비지 컬렉터

- Mono의 동적 메모리 관리 때문에, 메모리 해제를 위해 GC가 자동 호출 된다.

- GC는 언제 일어날지 모른다.

- GC가 일어나면, 게임이 멈추는 현상(랙)이 발생하게 된다.

- 동적 메모리 해제가 가능한 일어나지 않도록 하는것이 GC 관리의 핵심

10.1 오브젝트 풀링

- 오브젝트(or 프리팹)의 동적 생성과 해제는 부하가 크다.

- 오브젝트가 해제되면, 언젠가는 GC가 동작하여 정리 한다 = 랙이 발생

- 오브젝트를 풀을 만들어 미리 많이 만들어 두고, 활성화/비활성화로 사용한다.

- 풀에서 가져와서 사용하고, 사용이 끝나면 비활성화 상태로 풀에 반환

- 오브젝트 풀링 사용은 선택이 아닌 필수!!


11. GC에게 먹이 주지 않기

11.1 문자열 병합은 StringBuilder

- 일반 String + String을 쓰면 임시 문자열이 생성됨

- StringBuilder.Append() 함수를 사용하여 병합

11.2 foreach 대신에 for문 사용

- 일반 array에 한해서...

- Foreach는 한번 돌때마다 24byte의 쓰레기 메모리를 생성

- 10번만 돌아도 240byte의 GC 수거 메모리를 남김

11.3 태그 비교에는 compareTag()를 사용

- if(go.tag == "enemy") 대신에 go.compareTag("enemy")를 사용

- 객체의 tag 프로퍼티를 호출하는것은 추가 메모리를 항당하고, 복사

11.4 데이터 타입에는 Class 대신 구조체 사용

- 구조체는 GC에 들어가지 않는다. Stack에 할당

11.5 즉시 해제할 때는 Dispose 수동 호출

- 오브젝트의 dispose를 수동으로 호출하여, 즉시 cleanup

11.6 임시 객체들을 만들어내는 API들을 조심

- Ex) GetComponents<T>, Mesh.Vertices, Camera.allCameras,  etc...


12. C++ <-> C# 오버 헤드

12.1 객체의 변경 사항을 캐싱

- 객체의 이동과 변형에 대한 처리를 캐싱하고, 매프레임에서 딱 한번만 처리한다.

- Ex) Move()

12.2 컴포넌트 참조를 캐싱

- GetComponent()는 한번만 호출하여, 객체를 캐싱해두고 사용한다.

12.3 빈 콜백 함수는 제거

-Start()나 Update()같은 콜백함수는 비어있어도 성능에 영향을 끼친다.



리소스 최적화

1. 권장 압축 텍스쳐 사용하기

- 아이폰(PowerVR) : PVRCT

- 안드로이드(Teger) : DXT

- 안드로이드(Adreno) : ATC

- 안드로이드 (공통) : ETC1


2. 텍스쳐

2.1 텍스쳐 사이즈는 무조건 2의 제곱이어야 한다.

- POT(Power of Tow)

- POT가 아닌경우 POT텍스쳐로 변환되어 로딩 된다.

- 900 x 900 -> 실제로는 1024 x 1024로 변환


2.2 텍스쳐 아틀라스를 활용 하라.

- 텍스쳐 아틀라스로 최대한 묶음

- UI 만이 아니라 같은 재질의 오브젝트들을 묶음


2.3 압축된 텍스쳐와 밉맵을 사용하자. (대역폭 최적화)


2.4 32bit가 아닌 16bit 텍스쳐 사용도 상황에 맞게 고려




오디오 최적화

1. 모바일에서 스테레오는 의미 없다.

- 모두 92kb, 모노로 인코딩


2. 사운드 파일을 임포트하면 디폴트로 3D 사운드로 설정

- 2D 사운드로 변경


3. 압축 사운드(mp3, ogg), 비압축 사운드(wav) 구별

- 비압축 사운드 : 순간적인 효과음, 이펙트 등

- 압축 사운드 : 배경음악

Posted by dnrkckzk
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함