[언리얼 서밋] 2022_2 카트라이더 최적화 발표 정리

    프로파일링

    Stat UnitGraph

    • CPU, Draw, RenderThread 중 어디서 병목현상이 발생하는지
      GameThread에 집중해서 최적화 진행 / 쉐이더 컴파일을 미리하는 PSO(Pipeline State Object) 캐시 진행

    Unreal Insight

    • 어떤 Thread 나 어떤 Scope에서 병목현상이 나는지 확인할 수 있다.
    • 주요 Trace 채널
      • CPU
      • LoadTime
      • GPU
      • Net

    데디케이티드 서버 멀티플레이 테스트

    • Nullrhi (Null Rendering Hardware Interface)
      • rendering 없이 클라이언트 실행
    • Nullrhi 옵션을 통해 로컬에서 8인 멀티플레이 테스트

    최적화 핵심전략

    • White List : 필요한 기능을 필요한 시간에만
      • 필요 없는 Module, Plugin 확인
      • 필요 없는 Actor, Component, SubSystem 확인
    • Tick
      • DumpTicks를 통해 불필요한 틱이 돌고있는지 확인
      • Tick Aggregation
        • 패스트 유럽 2019의 해당 내용과 관련된 발표자료를 참고
      • Significance Manager
        • 오브젝트별 중요도 설정
        • 카메라에 보이는 오브젝트를 중요도를 높게 설정하자
    • SkeletalMesh 최적화
      • UpDate Rate Optimizations
        • 애니메이션 Tick의 발생 빈도 조절
      • MasterPose : 모듈식 캐릭터 작업
        • SetMasterPoseComponent
        • Child Componenet에 대한 Transform Update 부하 감소
      • Linked Anim Graph
        • 애님 인스턴스 구조를 일부 다르게 구현하고 싶을 때 중복되는 부분은 같은 애님 인스턴스를 사용하게 하고 다른부분을 Linked Anim 을 통해 구현 하면 로딩시간 및 메모리 측면에서 성능 향상
      • 기타 옵션들 비활성화
        • SetcomponentTickEnabled(false);
        • RegisterEndPhysicsTick(false);
        • SetCollisionEnabled(ECollisionEnabled::NoCollision);
        • bComponentUseFixedSkelBounds = true;
        • bSkipBoundsUpdateWhenInterpolating = true;
        • bUseAttachParentBound = true;
      • Animation이 있는 경우 Tick 옵션 활성화
        • SetComponenetTickEnabled(true);
        • RegisterEndPhysicsTick(true);
        • VisibilityBasedAnimTickOption = EVisibilityBasedAnimTickOption::OnlyTickPoseWhenRendered;
      • Tick을 비활성화시 LOD 처리
        • Significant Manager에 Register해서 별도로 관리
        • Significant Level 에 따라 LOD 변경
      • Animation Compression Library
        • Package 용량, 메모리, 압축해제 Gamethread 부하등
    • Multithreading
      • AnimBlueprint 의 멀티스레드 기능
      • ProjectSettings의 Allow Multi Threaded Animation Update 체크
        • UAnimInstance::NeedsImmediateUpdate : 루트모션이 없어야 하고, AnimNotify 도 없어야 한다.
        • USkeletalMeshComponent::RefreshBoneTransforms : TickGroup이 다르면 병렬 업데이트를 막는다.
      • ParallelFor
      • PrimaryComponentTick.bRunOnAnyThread
      • AsyncTask
      • FRunnable
    • UI 최적화
      • UI의 Gamethread 사용비중이 높음 그중에 SlatePrepass가 가장 높음
      • Invalidation box는 위젯을 지오메트리 cache에 담아 최적화
        • prepass, tick, paint
        • 갱신 빈도에 따라 역효과가 날 수 있음
        • Child widget 을 모두 검사
        • Animation 실행 시 CanCache 프로퍼티
        • 위젯 리플렉터의 인벨리데이션 디버깅을 활용
      • Hidden 대신 Collapsed 를 사용 레이아웃의 자리 계산을 없앨 수 있다.
      • UTextblock SimpleTextMode 적용하면 Preppass OnPaint call 감소
      • Retainer box에서 틱 웨이트를 조절하자
      • 불필요한 Tick 제거
        • DisableNativeTick
      • Engine Flag Toggle
        • 게임을 가리는 전체화면 UI일 때 활용
    • 로딩 시간 최적화
      • 레벨 이동 전 미리 로드 시작
      • GC가 안되도록 기존 장착 아이템들을 등록
      • 모드 리소스 preload
    • Overlap
      • Overlap 객체가 움직일 경우 부하가 발생함
        • Collision Block과 Query를 분리
    • 네트워크 최적화
      • 데디케이티드 서버 Unreal Insight
      • Replication Variables
        • Push Model, Disable Replication Property
        • 서버에서 매프레임 Dirty Check 후 Replication 하는 과정을 수동으로 변경
      • TArray / FString 가변길이 변수 최소화
      • FName도 FString으로 전송하기 때문에 주의
      • Parameter 마다 다른 빈도로 전송하고 싶을 때
        • 조건에 따라 컬링 / movement 같은 고빈도 전송요소
        • Pawn은 대신 저빈도로 전송, 항상 연관성
      • Vector 양자화로 전송 대역폭 최적화 (NetQuantize)
      • 고빈도 변수의 경우 Unreliable로 전송, Time Stamp를 통해 Order 확보

    마무리

    최적화는 특정한 기술을 사용하는 자체가 중요하기 보다, 개발하고 있는 프로젝트의 특성에 대한 이해와 그에 따른 맞춤 적용 방안이 중요하다.

    다시보기 링크

    https://www.youtube.com/watch?v=PqNm22br7y8

    반응형

    댓글

    Designed by JB FACTORY