관리 메뉴

도드넷

유니티 모바일(안드로이드) 최적화 - batches(draw call) 줄이기 등등 본문

창고/게임 개발 [Hidden]

유니티 모바일(안드로이드) 최적화 - batches(draw call) 줄이기 등등

도드! 2022. 2. 6. 04:23

 

 

유니티 모바일(안드로이드) 최적화의 정석.

 

개발하면서 깨달은 유니티 (Unity) 모바일 게임 안드로이드 환경에서

매우 부드럽게 60프레임으로 꿀바른듯 잘 돌아가게 하는 팁팁 모음.

 

#0 낮은 해상도 & 60 프레임 설정 사용

- 가장 멍청하고 간단하게 할 수 있는 방법이다. 게임 자체 해상도를 360p 로 낮추고 프레임 목표를 60으로 둔다.

- Screen.SetResolution(640, 360, true);

- Application.targetFrameRate = 60;

- 기본은 720p 로 Screen.SetResolution(1280, 720, true); 로 설정하면 된다.

 

#1 Batches (Draw Call)을 줄이자.

- 40~50 넘어가는 순간 당신은 무언가 크게 잘못하고 있으며 게임은 30프레임의 저주 받았다고 할 수 있다.

- 유니티 Batches 줄이는 방법 : 스프라이트 아틀라스 시스템 최대한 이용, 불필요한 다수의 효과빛 메터리얼 사용 자제, 불필요한 이미지의 겹침 자제, 1x1 픽셀 사용 금지. (픽셀 사용시 Draw Call 버그 있음), 스프라이트 마스크 사용 금지, 화면상 텍스트 표시 최소화 하기, Particle System 최소화 하기, 움직이지 않는 배경이나 장식물은 static 체크하기.

 

#2 모든 텍스쳐 압축

- 절대 256 X 256 을 넘지 않게 해야한다.

 

#3 반복문 = 스크립트 최적화 최대의 적, update() = 혐오물

- 일단 컨트롤/회전/움직임을 제외 하고 절대절대 Update()문을 사용하면 안된다.

(60프레임 기준에서 0.016초 마다 실행되는데 그러면 초당 약 60회다.)

- 스크립트상 반복문이 필요하면 ienumerator 함수에 while 과 yield return new waitforseconds 를 이용한다.

 

#4 단계적 초기화

- 여러가지 매니저와 기능 요소들을 start()함수에 둘 경우 이들이 한번에 불려서 [병목 현상]을 초래할 수 있다.

- 고로 단계를 나눠서 A 가 끝나면 B 를, B가 끝나면 C를 형식으로 단계적으로 초기화 시킬 필요가 있다.

- 왜 대부분의 게임에서 로딩스크린에 progress가 표시되는지 알수있는 대목이다.

 

#5 느린 함수는 제한적이게 실행

- 어떤 작업이 오래 걸리거나 다수의 FOR문등이 포함 되어 있을 경우 반드시 콜을 제한해야 한다.

- 가장 좋은 예로 Sorting 과 관련된 함수로 [가장 가까운 적을 찾아라]라는 명령에 사용된다.

만약 이 함수를 0.1초 단위로 다수의 객체가 부르면 시스템에 무리가 가는게 당연하다.

고로 이런 느린 함수는 함수 자체에 "쿨다운"을 부여해서 5초에 한번씩만 부를 수 있게 하면 좋다.

 

#6 빠르게 여러번 실행되는 [한번에 동시 다발적 다수 효과]에 주의하자.

- 관통하는 50구경 기관총이 A지역에 있는 모든 적을 관통하며 피해를 입힌다고 가정하자. 이때 어떤일이 벌어지고 어떤 함수가 실행되는지 주목할 필요가 있다. 어떤 피격 효과가 소환되고 피해를 입는 순간 어떤 이펙트와 애니메이션이 플레이 되는지, 이때 실행되는 코드에 무거운 for문같은 반복문이 없는지를 주목하자.

(참고로 기본적인 bool 검사나 >< 크기 검사 != 널검사 혹은 기본 사칙 연산은 문제가 되지 않는다.)

 

#7 오브젝트 풀링을 이용하자.

- (Instantiate로 생성하지 말고 최대한 미리 만들어서 불러내기)

 

#8 profile이나 inspector, console에 의한 유니티 에디터 렉을 피하자.

- 실제 게임외적이지만 확실한 테스트를 위해

profile을 사용하지 않고 inspector에 큰 객체 표시하지 않고 (비워두고)

console에 무리한 print 요구를 하지 말고 하이어라키에서 검색어를 놓치말자.

 

#9 모든 불필요한 것은 최대한 줄이자.

- 이 코드가 꼭 여러번 빠르게 실행되어야 할까? (->단계적으로 하나씩, 쉬어가면서 쓸수없을까?)

- 이 코드가 반드시 반복문안에 있어야 할까?

- 이 효과가 반드시 들어가야 할까?

- 이 효과에 꼭 N개의 particle system이 필요할까?

- 이 효과가 반드시 S개의 파티클을 소환해야 할까?

- 이 효과가 꼭 동시다발적으로 실행되어야 할까?

 

 

음... 이정도인듯? 나중에 생각나거나 익히며 더 적어봄 :3 히히

반응형
Comments