본문 바로가기

게임개발/공부

유니티 코리아 모바일 게임 성능 최적화 팁 - 1편. 공부.

오늘 본 영상이다.

 

유니티 코리아 영상들은 전체적으로 내가 듣기에 너무 어렵다는 느낌을 받아왔어서 들어도 아무것도 못하는 게 아닌가 걱정이 있었는데,

막상 보니까 의외로 나도 할 수 있는 방법들이 많았다.

편파적으로 밖에 이해하지 못했지만 그것만 해도 전보다 훨씬 상황이 낳아진 것 같다.

 

영상을 보면서 내가 만든 게임이 모바일 환경에서 유독 렉이 심했던 것이 이래서였구나 싶은 순간들이 있었다.

이해나 할 수 있을까 걱정도 했었는데 보길 잘한 것 같다.

 

 

프로파일러

아직 잘 모르겠다.

대신 심플 버전?으로 유니티 'Game' Tab의 'Stats'를 통해 확인하고 있다. 

 

렌더링(그래픽) / 업데이트(코드) / 피직스(물리)

ms(밀리초) 단위로 각 영역에서 어느정도 성능을 먹는지 확인할 수 있다.

렌더링/업데이트/피직스의 ms는 1프레임 그리는데 몇 밀리 초가 걸렸는지를 의미한다.

FPS는 전체적 트렌드를 보는 용도로는 좋지만, 실질적인 최적화에는 큰 의미가 없는 지표다.

3개 영역에서 같은 자원을 요구하기 때문에 가장 많은 자원을 요구하는지 파악해 그 영역을 최적화해야 한다.

거의 자원을 요구하지 않는 부분을 아무리 최적화해도 의미가 없다.

 

비유 : 식구 A, B, C 밥을 먹는데 C가 반찬의 90%를 먹고 있는데, A와 B에게 밥을 덜 먹으라고 해도 문제는 해결되지 않는다. 

 

CPU(시스템) / GPU(그래픽)

둘 중 하나라도 병목시 성능 다운.

 

기기 발열

핸드폰은 구조상 발열에 약하다.

온도가 올라가면 기기 보호를 위해 쓰로틀링(성능 다운) 발생.

쓰로틀링 발생 시 제대로 된 테스트가 불가능해 핸드폰 쿨러 필요.

 

메모리

PC는 8기가 렘으로 16기가 게임을 돌릴 수 있지만, 핸드폰은 구조상 메모리가 약하고 보조 시스템도 없어서 초과하는 즉시 게임이 뻗는다.

 

가비지 컬렉터

자동으로 작동하지만 의식은 하고 있어야 한다.

특정 상황에서 작동하는 데다 성능을 먹기 때문.

Tip : 저장을 구현할 때 string 변수를 매 프레임 쓰는 건 부담이니 int 변수를 써서 ID 형태로 저장하는 게 좋다.

 

코 루틴

대기 시간을 줄 때마다 new 키워드를 사용하면 한번 대기할 때마다 가비지가 발생한다.

처음에 new 키워드를 쓸 때 캐싱하고 다시 불러와 사용하면 가비지가 발생하지 않는다.

캐싱 : 변수에 담아서 사용하는 것. 웹사이트에서 캐시를 저장한다는 거랑 같은 뜻인 것 같다.

 

어뎁티드 퍼포먼스 (안드로이드라면 필수)

보긴 봐야 할 것 같은데 아직은 어떻게 쓰는지 잘 모르겠다.

 

AddComponent

성능을 많이 먹는다. 동적으로 하면 절대 안 된다. 미리 각 경우의 수만큼 프리 펩을 만들고 그걸 로드해야 한다.

 

GetComponent

Add 만큼은 아니어도 상당히 무거워 매 프레임마다 하면 성능에 영향을 미친다.

 

오브젝트 풀

오브젝트 풀을 만들 때 부모 오브젝트를 바꾸지 마라.

ReParent 이슈 : SetParent() 함수를 사용해 부모를 바꾸는 경우가 많은데, 성능을 먹어서 왼만하면 안 하는 게 좋다.

 

스크립 터블 오브젝트 (적극 권장)

여러 곳에서 공통적으로 쓰이는 속성을 상속으로 구현하는 것은 추천하지 않는다.

상속은 구조가 깔끔하지만 성능에 좋지 않다(파라미터가 많을수록 시리얼라이즈 항목 증가).

스크립 터블 오브젝트는 이미 시리얼라이즈 돼있어 성능적으로 훨씬 이득이다.

 

프로젝트 구성(configuration)

필요 없다 싶은 요소는 전부 끄거나 줄이면 십중 팔고는 맞다.

Tip : 저사양 타깃이면 플레이어 퀄리티 세팅 - 벌칸? 제외.

 

물리

리지드 바디나 물리연산 코드는 FixedUpdate() 함수에서 처리해야 한다.

유니티 물리 시스템 구조상 그래야 동기화가 원활하다.

 

하이어 라키 구조

오브젝트 부모 자식 뿌리가 깊고 넓을수록 연산량이 증가하고, 멀티 스레드(병렬 작업) 특성도 살리지 못해 성능을 먹는다.

 

스크립트에서의 트렌스폼 접근

하나의 트렌스폼을 여러 스크립트에서 건드리면 그만큼 연산 횟수가 증가한다.

이것이 하이어 라키 구조와 엮이면 그 자식 오브젝트도 움직여야 해서 그만큼 배로 많은 횟수의 연산이 발생한다.

Tip : TransformSetPositionAndRotation을 써서 위치와 회전을 2번 연산할 것을 1번의 연산으로 처리할 수 있다.