[UNSEEN 리팩토링] UI 최적화 공부

suyoung·2024년 7월 20일

UE5

목록 보기
4/12

UNSEEN 리팩토링의 마지막 단계입니다.
충돌부터 UI, 상호작용 없는 UI를 모두 HUD로 옮기는 것까지 대략 1주간 모든 작업을 수행했습니다!
부족함을 알고, 제 자신을 뒤돌아보기 위한 작업이었고 앞으로는 더 나은 개발자가 될 수 있도록 노력할 예정입니다.

참고자료:
Unreal Engine 공식 유투브
https://www.youtube.com/watch?v=OyY3OYbNK7s

  • UI 프레임워크는 일반적인 툴키트만을 제공
  • UI에는 틱이 실행되는 타임라인이 있고 상호의존적인 레이아웃 규칙도 많다.
  • 위젯마다 수많은 레이어가 존재
  • 각 레이어는 아래 레이어의 지오메트리 규칙에 불가
  • UI 내에는 다이나믹 텍스트도 포함, 레이아웃 규칙이 복잡해 질 수도 있다.
  1. AHUD::Tick
    • HUD 액터이며, Tick은 일반적인 액터와 같음.
    • 위젯 생성/제거, 게임 데이터와의 통신, 일반적인 HUD 작업
    • CreateWidgets 함수를 주의
      • 새 위젯을 생성하려면, 비용이 많이 든다.

        이를 방지하기 위해서, 풀링 시스템을 구축합니다.

        즉, 게임 시작시 CreateWidgets를 반복적으로 호출해서, POOL을 채우고, 런타임 시에는 풀에 채운 위젯을 요청하고, 재활용한다.

	for (const auto& HUD : HUDClass)
	{
		UUserWidget* Widget = CreateWidget<UUserWidget>(GetWorld(), HUD.Value);
		Widget->AddToViewport(0);
		Widget->SetVisibility(ESlateVisibility::Hidden);
		HUDs.Add(HUD.Key, Widget);
	}
	//게임 시작시 미리 생성한 후
	//아래 함수를 사용해서, 활성화 시킬지 말지만 정한다.
	void AQLHUD::SetHiddenHUD(EHUDType UItype)
	{
		if (HUDs.Find(UItype))
		{
			HUDs[UItype]->SetVisibility(ESlateVisibility::Hidden);
		}
	}
	void AQLHUD::SetVisibilityHUD(EHUDType UItype)
	{
		if (HUDs.Find(UItype))
		{
			HUDs[UItype]->SetVisibility(ESlateVisibility::Visible);
		}
	}
	
  1. SlatePrepass
  1. DrawWindow

    1. Widget::Paint (재귀적으로 호출)

    2. 각각의 위젯의 블루프린트의 Tick&Native Tick 내부적으로 호출

    3. Rebuild the hit test grid

      1. Widget Grid 를 쿼드 트리 형태로 위젯 탐색을 수행
    4. adds items to the element batcher in SlateRHIRender

      • 위젯 트리의 레벨을 낮추는 방법

        Why?

        • Paint 함수는 재귀적으로 호출되기 때문에, 각 컨테이너에 호출

        • 즉, 컨테이너 안에 컨테이너를 넣고, 그 컨테이너 안에 또 컨테이너를 넣으면 재귀적인 함수 호출 수가 늘어나게 된다.

          ⇒ 위젯 트리가 평탄화되어 있을 수록 재귀 횟수도 줄어든다.

        • USE Visible/Hit-Test-In-Visible 대신에 Self-Hit-Test-In-Visible 을 이용하는 것.

          • 보이긴 하지만, Hit-Test 그리드에는 추가하지 않도록 하는것.
          • Hit-Test-In-Visible와 Self-Hit-Test-In-Visible의 차이점은 Hit-Test-In-Visible의 경우, 히트 테스트 그리드에 추가된 모든 위젯의 Childs를 중지한다는 점 ( 모든 위젯이 Hit-Test가 필요 없는 경우에 적합 ⇒ 플레이어와 상호작용 없는 UI)
      • Tick 함수를 삭제하는 방법

        • Tick 함수가 삭제됐다고 성능이 나아지는 것이 아닐 수도 있음.
        • 체력 바를 만들 때 Tick 대신, 이벤트 기반의 접근법(델리게이트처럼) 응용

현재 레벨 최대, 6레벨, HUD 의 최대 4까지 줄이기.

WidgetSwitchWeapon 내부에서 4레벨을 더 사용,즉 8레벨. => 이를 Overlay 와 HorizontalBox로 3레벨 줄임.


위 ui 레벨에서 아래 ui로 단순화작업 수행

profile
게임 클라이언트 프로그래머

0개의 댓글