포스트

Profiler를 사용하여 프레임 레이트 최적화 시도

본 글은 제 개인적인 공부를 위해 작성한 글입니다. 틀린 내용이 있다면 언제든지 피드백을 주시면 감사하겠습니다. 참고로만 활용해주시길 바랍니다.

개요


유니티에서 제공해주는 프로파일러(Profiler)를 사용하여 CPU 사용량을 확인할 수 있다.

프로파일러 상에서 특정 코드를 tag로 나타내려면 아래 코드로 묶어주면 된다.

1
2
3
Profiler.BeginSample(str tag);
// code
Profiler.EndSample();



디버그 로그


  • 현재 상태

    서버에서 수신한 KeyMessageDebug.LogLogManager.instance.Log를 통해 콘솔과 GUI 출력 중

    약 15 FPS

    CPU:100ms ~ 150ms

  • 개선안 - LogManager.instace.Log 제거

    약 60 FPS

    CPU: 15ms ~ 20ms

  • 개선안 - Debug.LogLogManager.instance.Log 제거

    약 60 FPS

    CPU: 15ms ~ 20ms

  • 결론

    1. GUI에 많은 출력을 하는 것은 부하가 크다.

      서버에서 들어오는 패킷처럼 지속적으로 데이터는 GUI에 출력하지 말자

    2. Debug.Log는 성능에 영향이 없다.



파티클 시스템


  • 현재 상태

    캐릭터 주변에 넓은 범위로 눈 내리는 파티클 시스템이 작동중

    ParticleSystem.CollisionModule가 15~28%를 사용 중

  • 개선안
    1. Collision 제거
    2. Culling Mode를 Pause로 설정

      Pause - 화면에서 벗어나면 중지

    3. Ring Buffer Mode - Pause Until Replaceed

      수명을 다한 파티클을 일시 정지하고 최대 파티클 수에 도달하면 재활용

    4. Max Particle - 1500
    5. Start Lifetime - 3 sec
  • 결론

    눈 파티클 시스템에는 콜라이더가 필요 없었기에 삭제

    화면에서 사라지면 사라지게 하여 부하를 줄였다.



포스트 프로세싱


속도감을 위해 여러 종류의 포스트 프로세싱을 사용 중이었음.

Depth Of Field는 부하가 크다.

가장 눈에 띄는 효과인 Color Grading를 제외하고 비활성화

대신에 쉐이더 등을 사용하여 속도감을 대체



가비지 컬렉터


C#은 가비지 컬렉터에 의해 힙 영역에 있는 메모리들이 할당 해제되고, 클래스의 멤버 변수들은 힙 영역에 할당된다.

  • 지역 변수들은 가비지 컬렉터가 아닌 시스템에 의해 할당 해제됨

가비지 컬렉터가 메모리 영역에 있는 변수들을 한 번에 수거할 때 발생하는 퍼포먼스를 퍼포먼스 스파크라고 함.

  • 가비지 컬렉터가 수거하는 시점은 사용자가 알 수 없다.

따라서 할당을 최대한 덜 하자

클래스는 참조 형식으로 힙에 할당되고, 구조체는 값 타입이고 스택에 할당된다.

전역 변수나 여러 함수에서 사용되는 변수일 경우 클래스를 사용

한 함수 안에서만 사용하는 멤버변수는 구조체를 사용하는게 최적이다.



GUI Vertex


  • 현재 상태

    미니맵 카메라가 Vertex를 50만개 사용 중

  • 개선안

    미니맵 카메라의 Culling Mask를 Ground만 설정하여 필요한 길만 표현

    Vertex를 약 5만개 사용으로 줄임



카메라 렌더링


  1. Clipping

    거리에 따라 렌더링 여부

    Near보다 가까이 있고, Far보다 멀리 있는 오브젝트는 렌더링 X

  2. Occlusion Culling

    다른 오브젝트에 가려져, 카메라에 보이지 않는 오브젝트는 렌더링 X

    가릴 오브젝트는 Inspector → Static → Occluder Static

    가려질 오브젝트는 Inspector → Static → Occludee Static

    Window → Rendering → Occlusion Culling → Bake으로 OcclusionCullingData 생성

  3. Frustum Culling (절두체 컬링)

    절두체(관측 공간) 외부에 있는 렌더러를 제외

    유니티 엔진에서 자동으로 지원

  4. Culling Mask

    카메라의 컬링 마스크와 일치하지 않는 레이어의 렌더러는 제외

    미니맵의 경우 경로를 보여주어야 하는 길만 Culling Mask를 설정



세마포어


image

많은 스택 오버플로우와 유니티 문서를 뒤졌으나 이유를 알 수 없다.

혹시 아는 사람이 있다면 댓글로 알려주세요..



참고

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.