-
2024.5.13 - 최적화TIL 2024. 5. 13. 18:19
게임을 배포할 때 최적화가 가장 필수적이긴합니다.
그러나 최종 프로젝트 때 게임 개발이 늦어지면서 최적화를 진행하지 못하고 배포를 해버렸습니다...
그래서 혼자서라도 해보는 최적화!
Game 씬 오른쪽 위에 있는 Stats를 보면 FPS와 Batches라고 적혀져 있는게 있습니다.
최적화를 볼 때 가장 중요한 부분입니다.
FPS : 1초에 화면이 다시 그러지는 것의 단위
높으면 높을 수록 렉 없이 잘 작동하고 있다는 것입니다.
Batch : CPU가 GPU에게 물체를 그리라고 요청
많을 수록 CPU와 GPU에게 요청하는 횟수가 늘어서 화면의 로딩이 느려집니다.
즉, FPS는 높고, Batches는 낮은게 좋습니다.
그렇다면 어느 구간에서 FPS가 낮아지는지 확인하고, 그 원인이 무엇인지 아는게 중요합니다.
이를 확인하기 위해서는 Profiler라는게 있습니다.
Window - Analysis - Profiler
일반적으로 CPU 사용량을 확인하면 됩니다.
프레임 단위로 지표가 나오는데 그래프가 클 수록 FPS가 낮아집니다.
그래서 실행하고 그래프가 튀는 부분을 선택하면 어느 부분이 문제인지 확인할 수 있습니다.
TimeLine으로 되어 있는 부분을 Hierarchy로 바꿔서 확인이 가능합니다.
EditorLoop는 빌드할 때 실행되지 않는 부분입니다.
거의 대부분의 프레임을 소모하는 것이 EditorLoop이기 때문에 빌드할 때는 Editor에서 작동하는 것보다 렉이 덜 걸릴 수 있습니다.
PlayerLoop 부분을 집중적으로 봐야합니다.
갑자기 치솟는 그래프의 부분을 확인했을 때 어떤 부분이 문제인지 알 수 있습니다.
이를 통해서 문제인 부분을 확인하고 고칠 수 있습니다.
Atlas 사용
작은 이미지의 경우 Atlas를 사용하면 Batch가 낮아집니다.
Atlas를 사용하기 위해서는
Edit - Project Setting - Editor - Sprite Packer : Mode -> Sprite Atlas V1 - Always Enabled
로 설정해줘야 사용이 가능합니다!
Assets - Create - 2D - Sprite Atlas
생성해서 사용하는 작은 이미지들을 전부 넣어주면 됩니다.
이때 조심해야하는건 최대한 같은 이미지 크기를 가지고 있는 것들을 모아서 넣어주면 됩니다.
안그러면 사용할 때 이미지가 이상하게 짤려서 다른 부분과 겹쳐 나올 수 있기 때문입니다.
직접 사용했을 때 2~3 정도 낮아지는 걸 확인했습니다.(37 -> 34~32)
씬마다 다르지만 어느 정도 감소하는 것을 확인했습니다. 굿
스크립트 수정
스크립트를 다른 방법으로 작성한다면 최적화에 도움을 줍니다.
GameObject.Find 등 Hierarchy를 쭉 탐색하는 행동은 자제해야합니다.
차선책으로 GameObject.GetChild(index)를 사용해주었습니다.
리스트나 딕셔너리의 경우에는 재할당을 할 경우에 GC의 먹이가 되므로 Clear를 활용해주고,
Add시 Default 사이즈(4)를 넘어갈 경우에는 두배의 할당이 일어나기 때문에 처음 할당할 때 사이즈를 추측해서 미리 크게 할당하는 것이 좋습니다.
string에서 += 을 사용해 객체 할당이 일어나고, 문자열이 자주 변경될 경우에는 StringBuilder를 이용하는 것이 좋습니다.
당연한 말이지만 반복문 내에서는 new를 사용하는 것은 좋지 않습니다.
잊을 수 있겠지만 코루틴에서 사용하는 yield new return도 new이므로 미리 변수를 할당받아서 사용하는 것이 좋습니다.