ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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이므로 미리 변수를 할당받아서 사용하는 것이 좋습니다.

    'TIL' 카테고리의 다른 글

    2024.04.25  (1) 2024.04.25
    2024.4.17  (0) 2024.04.17
    2024.4.1  (1) 2024.04.01
    2024.3.28  (0) 2024.03.28
    2024.3.27  (1) 2024.03.27
Designed by Tistory.