늘 그렇듯 쓸 데 없는 내용 이렇게 글을 남깁니다.
유명한 내용인데 유니티가 많이 업데이트 되면서 쓸모 있는지는 좀 더 검증이 필요하긴 합니다.
코드 최적화
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) 구별
- 비압축 사운드 : 순간적인 효과음, 이펙트 등
- 압축 사운드 : 배경음악
'Unity Tip' 카테고리의 다른 글
Scroll Rect 맨 처음 부터 나오게 설정하기.(※요약 있음※) (3) | 2018.04.01 |
---|---|
Toggle Group, Toggle, Dropdown (0) | 2018.03.21 |
주로 쓰는 VS 단축키 (0) | 2018.03.06 |
Android Native Audio Asset 사용법(※요약 있음※) (0) | 2018.03.05 |
유니티 애즈 달기 2017.3 (0) | 2018.03.01 |