https://docs.unrealengine.com/5.3/ko/font-dpi-scaling-in-unreal-engine/
Pixel Size = (Point Size of Font * Screen Resolution) / (Font Resolution in DPI / UE Default Font Resolution(=96))
Font Resolution in DPI는 환경설정을 통해 설정할 수 있음
UE는 사용하는 글리프와 Font 크기에 따라 Atlas를 생성하여 최적화 함
즉, 프로젝트 전체에서 사용하는 Font Size의 종류를 줄이는 것이 최적화에 좋음
Runtime 방식으로 Font를 계산하는 방법도 있음
https://docs.unrealengine.com/5.3/ko/font-asset-and-editor-in-unreal-engine/
Font는 Font Asset과 Font Face Asset으로 구성
Font Asset은 TTF, OTF 파일을 Runtime에 계산하는 Composite방식과 Atlas를 사용하는 Offline 방식
Font Asset은 Font Editor로 열면 Bold, Italics같은 스타일같은 Font Family나 Preview같은 기능 지원
Font Family는 Font Face 참조
Font Face Asset은 흔히 Font라 부르는 TTF, OTF 파일을 의미
Font Face Asset은 Hinting, Loading Policy같은 Font Data 저장
Runtime방식의 Font Asset은 Font Family에서 각 문자에 적합한 Font 사용?
설명을 보니까 지원하는 문자에 따라 알아서 Font를 변경하는 듯?
UMG의 Font Detail에서 TypeFace 등 지정이 가능한데, 이를 기반으로 지원하는 문자에 적합한 Type 등을 고려해서 자동으로 변환하는 듯
https://docs.unrealengine.com/5.3/ko/slate-ui-sleeping-and-active-timers-in-unreal-engine/
Slate는 IMGUI로 불필요한 Processor 사용 유발 가능
Active Timer는 Editor UI 작업시에만 사용해야 함
Slate는 사용자 액션이 없고 Active Timer가 없을 때 Sleep 상태 진입
Slate의 Tick/Paint를 요구하는 Widget에 의해 명시적으로 등록되는 Delegate 함수
EActiveTimerReturnType FuncName(double InCurrentTime, float InDeltaTime);
FWidgetActiveTimerDelegate ActiveTimerDelegate += FuncName;
SWidget::RegisterActiveTimer(TickPeriod, ActiveTimerDelegate);
내부 소스코드를 찾아보니 FSlateApplicationBase에 static한 CurrentBaseApplicaion이라는 객체를 Singleton형식으로 접근해서 등록하는 것으로 보임
https://docs.unrealengine.com/5.3/ko/optimization-guidelines-for-umg-in-unreal-engine/
Slate Widget의 정보를 caching 후 Painting, Layout, Hierarchy 정보를 모니터링하여 변경사항이 없다면 cache 정보를 이용해 Painting
자주 변경되지 않는 Widget 그룹에 효과적
프레임 단위로 변경되는 Widget은 불필요한 Caching을 유발하지 않도록 Volatile 표시 필요
OnTick, OnPainting, Attribute Binding보다는 Event Dispatcher와 Delegate 사용
Widget 내부의 모든 자손들은 Visible여부와 관계없이 로드 및 생성하므로 사용하지 않는 Widget은 최대한 줄여야 함
다양한 Widget들을 여러 카테고리(항상 표시, 빠른 응답, 지연 가능)로 분해
Canvas Panel은 Horizontal Size Box, Vertical Size Box같은 다른 Container Widget과 다르게 Child Widget마다 Layer ID 부여
이로 인해 다수의 Draw Call 사용
Canvas Panel은 사용을 최소화 할 것
Size Box는 크기 계산과 렌더링을 위한 절차가 복잡하므로 동적으로 계산할 필요가 없다면 Spacer 사용 추천
Scale Box와 Size Box를 결합해서 사용하지 말 것
Text에 Style을 지원하고 싶다면 가능하면 Rich Text Widget보다는 Custom Font Asset을 이용해서 표준 Text Widget을 사용할 것
Material만 있는 Animation의 경우 GPU에서 처리되므로 CPU 비용을 유발하지 않음
발광, 색변화, 루핑 등
Sequencer Animation은 Animating 시작전에 초기화하는 작업에 Scripting에 비해 비용이 필요
그 외에 Script방식이든 Sequencer 방식이든 Animation에 소모되는 비용은 동일
Layout을 변경하는 Animation은 가장 CPU 비용을 비싸게 소모
Blueprint나 Sequencer에서 색 변경 등 Transform이 아닌 Animation도 Invalidation을 유발하는 듯 하지만 그 중 Layout이 가장 비싼 비용을 유발하는 듯
https://docs.unrealengine.com/5.3/ko/invalidation-in-slate-and-umg-for-unreal-engine/
UI를 다시 그리기위해 사용하는 CPU연산을 최소화 하는 기술
자주 변경되지 않는 Widget에 적합
Widget별로 Invalidation을 설정하고자 할 경우 Invalidation Box나 Retainer Panel 사용
UI 전체에 Invalidation을 설정하고자 할 경우 Global Invalidation 사용
Retainer 패널은 렌더 타겟을 사용하는 방식으로 Invalidtaion Box보다 더 많은 메모리를 사용하지만 Draw Call수는 더 줄일 수 있음
다만, Repaint과정에 오버헤드가 너무 높음
Invalidation Box부터 적용하는 것을 추천
자주 변경되야 하는 Widget의 경우(Animation) Volatile 설정하여 휘발성 위젯으로 설정하면 Caching 하지 않음
https://docs.unrealengine.com/5.3/ko/umg-viewmodel/
https://beomy.tistory.com/43
View Model : View를 표현하기 위해 만든 View를 위한 Model. View에 전달하기 위한 데이터 처리 절차 포함