출처 :http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&page=1&sn1=&divpage=1&sn=on&ss=on&sc=on&keyword=%C0%AF%B4%CF%C6%BC&select_arrange=last_comment&desc=desc&no=275
[유니티 엔진 팁 - 로딩시간 최적화에 대해서]
로딩시간 최적화
- 직감도 좋지만 프로파일러를 적극 활용하는것이 정답입니다.
에디터의 profiler탭을 보면 함수들의 수행시간이 표시되는데
시간을 많이 잡아먹는 부분을 집중적으로 수정하면 됩니다.
- 프로파일러를 확인하지 않았을때 모르고 지나갔던 부분들...
불필요한 물리 오브젝트 제거!
스프라이트 출력용도로만 사용하던 오브젝트에 BoxCollider가 붙어있었는데,
프로파일러를 확인해 보니 이 collider를 재설정 하는데 많은 시간이 소요되더군요.
이부분을 제거하고 나니 로딩속도가 눈에띠게 빨라졌습니다.
- Find류의 함수는 주의할 것.
특히 Update등 매프레임마다 호출되는 곳에서는 GameObject.Find같은 검색함수는
되도록 사용하지 않는것이 좋습니다. 초기화할때 미리 레퍼런스를 갖고 있는것을 권장하고요,
성능좋은 PC에서는 차이가 없어보이지만 모바일에서는 확연한 차이를 발생시킵니다.
- 릴리즈 전 Debug.Log 지우기.
릴리즈 할때는 Debug.Log등의 로그출력부분은 모두 제거하는것이 좋습니다.
로그 남기는것 자체가 프레임에 영향을 주기 때문이죠.
예)
//Debug.Log("[ERROR] " + msg); // 이런 문자열 합성코드가 들어있으면 가비지 컬렉터의
영향을 받습니다.
그리고 Debug.Log는 콘솔이나 파일로 기록을 남기기 때문에 속도가 굉장히 느리죠.
- 유니티 로딩 시스템 이해
아이폰이나 안드로이드용 유니티 어플을 실행해보면 다음과 같은 순서로 진행됩니다.
1) 어플실행 -> 2) 유니티 로고 출력 -> 3) 게임화면
"2)번 유니티 로고 출력"시 씬에 올라와 있는 오브젝트들을 모두 로딩하게 됩니다.
이때에는 로고 이미지 한장만 랜더링 할 수 있는 상태이기 때문에
로딩 진행상황등을 표시 하기가 어렵습니다(스크립트로 제어가 불가능함).
따라서 이부분을 빨리 지나가게 한 뒤 "3)번 게임화면"에 들어왔을때
별도의 로딩화면을 만들어 동적으로 로딩하도록 하는 시스템을 갖추는것이 좋아 보이더군요.
'잡다한것들전부 > 팁' 카테고리의 다른 글
| [펌] 유니티 엔진 팁 - 광고 모듈 붙이기 (0) | 2014.01.16 |
|---|---|
| [펌] 유니티 엔진 - 오브젝트 풀 시스템 (0) | 2014.01.16 |
| [펌] 유니티 엔진 팁 - 로딩시간 최적화에 대해서 (0) | 2014.01.16 |
| [펌] 유니티 엔진 팁 - 비동기 로딩 흉내내기 (0) | 2014.01.16 |
| [펌] 유니티 엔진 팁 - GUI시스템 (0) | 2014.01.16 |
| [함수] 유니티 함수 Vector3.Lerp에 대해서 알아보자. (0) | 2014.01.12 |
Trackback 0 And
Comment 0
출처 : http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&page=1&sn1=&divpage=1&sn=on&ss=on&sc=on&keyword=%C0%AF%B4%CF%C6%BC&select_arrange=last_comment&desc=desc&no=276
[유니티 엔진 팁 - 비동기 로딩 흉내내기] 비동기 로딩 흉내내기. - 유니티에서는 멀티쓰레드 로딩을 지원하지 않습니다. Resources.Load같은 유니티 함수들은 메인쓰레드에서만 작동하게 되어 있다고 하네요. - 비동기 로딩을 흉내내는 방법은 몇가지가 있는데 1) assetbundle 시스템을 이용하는 방법, 2) scene의 background로딩 기능을 이용하는 방법, 3) 코루틴을 사용하여 비슷하게 흉내내는 방법등이 있습니다. 1) assetbundle은 리소스가 바뀔때마다 매번 만들어 줘야 하는 번거로움이 있습니다. 2) scene의 background로딩 기능은 메뉴얼 대로 했는데도 제대로 작동하지 않는것 같더군요. background로딩을 걸어놓고 다른 scene의 OnGUI등에서 매프레임마다 변수를 출력해봤는데 자연스럽게 랜더링 되지 않고 중간중간 블럭이 걸렸습니다. 3) 코루틴을 사용하여 로딩하는 방식 : 한번에 로드하는 오브젝트의 크기를 최소화 하여 잘게 나눈 후 "로딩 -> yield -> 로딩 -> yield" 를 반복하여 처리하였습니다. - yield를 할때 화면 랜더링이 한번 이루어지기 때문에 비동기 로딩처럼 보일 수가 있죠. - 테스트결과 랜더링이 블럭되는 시간이 짧기 때문에 자연스러움은 있지만, 전체적인 로딩시간은 오히려 더 길어지는 문제가 발생하였습니다! 아마도 화면 랜더링을 하는 시간 때문인지 yield후 다음 오브젝트 로딩까지의 딜레이가 조금씩 생기더군요. 이런것들이 여러개 모이니 전체적인 로딩시간이 몇초정도 더 길어지게 되었습니다. (PC에선 몇초가 큰 의미 없겠지만 모바일에선 길게 느껴지더군요.ㅠ_ㅠ) 결국 GUI, sound, object등 큰 줄기로만 구분하여 중간중간 로딩 진행상황만 표시해주는것으로 처리하였는데, 이렇게만 해줘도 중간에 무한 대기 상태로 빠지지 않기 때문에 유저입장에서 볼 때 로딩이 약간 빨라진듯한 느낌이 들게 됩니다. |
'잡다한것들전부 > 팁' 카테고리의 다른 글
| [펌] 유니티 엔진 - 오브젝트 풀 시스템 (0) | 2014.01.16 |
|---|---|
| [펌] 유니티 엔진 팁 - 로딩시간 최적화에 대해서 (0) | 2014.01.16 |
| [펌] 유니티 엔진 팁 - 비동기 로딩 흉내내기 (0) | 2014.01.16 |
| [펌] 유니티 엔진 팁 - GUI시스템 (0) | 2014.01.16 |
| [함수] 유니티 함수 Vector3.Lerp에 대해서 알아보자. (0) | 2014.01.12 |
| 유니티 Vector3 를 상수 선언 하고 싶을때. (0) | 2014.01.09 |
Trackback 0 And
Comment 0
출처 : http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&page=1&sn1=&divpage=1&sn=on&ss=on&sc=on&keyword=%C0%AF%B4%CF%C6%BC&select_arrange=last_comment&desc=desc&no=274
이번에 유니티 엔진으로 아이폰/안드로이드 게임을 개발하면서 겪었던 문제점 및 해결방법들 입니다. 특별한게 있는건 아니지만 공유하는 측면에서 올려보겠습니다~ 1. 유니티 GUI시스템. 유니티를 쓰는 사람들의 말을 들어보면 Unity3D의 기본적인 GUI는 가급적 사용하지 말것을 권장하고 있습니다. 빈 OnGUI함수조차도 성능을 저하시킨다고 하네요. 저희 프로젝트에서는 EzGUI라는 써드파티 라이브러리를 구입하여 사용했습니다. 장점으로는... - UI이미지들을 텍스쳐 아틀라스(atlas)로 만들어서 좌표를 따다 쓰는 방식이라, 한번의 drawcall로 모든 UI가 그려지기 때문에 성능이 좋음. - 디자이너가 작업시 위지윅 방식이 가능함(에디터내에서 직접 보면서 배치할 수 있음). 단점은... - 스킨시스템은 지원 안됨(모서리만 따서 늘려쓴다던가 하는 방식). - atlas(아틀라스:텍스쳐들을 모아놓은 하나의 큰 텍스쳐)를 만들때 이미지 배치가 수시로 바뀜. 어차피 uv좌표를 직접 입력하진 않기 때문에 문제는 없지만 웬지 개운하지 않음. 특시 prefab과 연결시켜 놓으면 값이 꼬이는 문제가 발생하여서 연결을 끊고 atlas를 만들어야 해서 번거로움이 심했음. (이 부분은 저희가 잘못 사용한것일지도 모르겠습니다. 정식 강좌를 본것이 아니라 인터넷에서 그때그때 찾아 한 것이라^^) - 업데이트 소식이 없음. 디자이너와의 분업 측면 - 디자이너가 레이아웃을 잡고, prefab으로 만든 후 패키징 하여 프로그래머에게 전달하여 작업함. 큰 무리는 없었지만 Unity3D에디터에 캐시파일이 남아서 인지, 가끔 종료한 후 다시 열어줘야 새로운 내용이 적용되었음. - 공식 사이트나 포럼에서도 분업에 대한 정확한 메뉴얼을 찾지 못하여 이 방식이 올바른것인지는 애매하였음. - 공동작업에 대한 고려가 많이 부족하다는 느낌을 받음. 해상도 작업 - 기본적으로 여러 해상도에 대한 지원이 부족한듯 함. - 화면 크기가 바뀌었을때 이미지 스케일이 원하는 대로 나오지 않았기 때문에 직접 로직을 작성하였음. - 안드로이드에서 가장 많이 사용하는 480*800을 기준으로 이미지작업을 하고, 화면 세로 크기의 비율을 구해서 모든 UI오브젝트들의 스케일에 적용시켜주었음. - 일부UI 컨트롤에는 적용시키지 말아야 할 경우도 생김 (예를 들면 슬라이더바같은 경우 바와 knob으로 구성되는데 부모-자식 관계에 있다보니 스케일이 이중으로 적용되어서 의도한것과 다르게 나타났다. 따라서 이런 경우에는 자식 오브젝트들의 스케일 적용은 건너뛰는 루틴을 넣어야 했다). 폰트작업 - BMFont라는 툴로 ttf파일에서 텍스쳐와 좌표값을 뽑아낸 뒤 불러다 쓰는 방식임. - 한글 입/출력은 잘 됨. - 폰트 색상 조절은 원하는 컬러의 material을 만들어서 사용하는 방식이며, 크기 조절은 오브젝트의 스케일값으로 조절이 가능함. * 다음프로젝트에는 NGUI를 사용할 예정입니다~ |
'잡다한것들전부 > 팁' 카테고리의 다른 글
| [펌] 유니티 엔진 팁 - 로딩시간 최적화에 대해서 (0) | 2014.01.16 |
|---|---|
| [펌] 유니티 엔진 팁 - 비동기 로딩 흉내내기 (0) | 2014.01.16 |
| [펌] 유니티 엔진 팁 - GUI시스템 (0) | 2014.01.16 |
| [함수] 유니티 함수 Vector3.Lerp에 대해서 알아보자. (0) | 2014.01.12 |
| 유니티 Vector3 를 상수 선언 하고 싶을때. (0) | 2014.01.09 |
| [펌][C# 강좌] 직접 만들어보는 메모리 풀 클래스 (0) | 2014.01.05 |
Trackback 0 And
Comment 0


