개인적으로 Unity를 사용하던 시절에도 Observer패턴을 구현하거나, EventDispatcher를 활용하여 최대한 디커플링 된 환경을 만드려고 했다. 보기에도 깔끔하고, 커플링 된 부분들을 수정하는 것에 몇 번 데이고 난 후부터 그런 방향으로 작성했던 것 같다.
하지만, 점점 배우면서 OOP가 구조적인 부분 말고 성능면에서 과연 괜찮은 것인가? 이런 Delegate 형태는 어떤가?를 생각하게 된다. 특히 컴퓨터구조를 배우면서 좀 더 성능 측면에서 고려하게 된 것 같다.
Delegate
이벤트의 구독-발행
함수를 객체처럼 사용
발행자-이벤트-구독자 형태이다.
C++에서의 Delegate는 안정성을 검증하기 때문에 런타임에서 RTTI 비교가 성능이 좋지 않음.
따라서 잘 쓰이지 않음. (std::bind, std::fuction)
이를 Unreal에서 안정적으로 구현하여 지원하고 있음.
-> 이는 느슨한 결합 측면에서는 좋지만, 속도 측면에서 좋지 않음(캐시 적중률이 낮음)
->-> 항상 컴포넌트 형태가 좋은 것은 아님
Observer패턴과 Delegate패턴의 단점:
디버깅이 어렵다_이전의 콜스택으로 돌아가기 어려움. 구독 주체를 파악하기 어려움.
캐시 메모리
캐시 메모리는 CPU가 사용할 법한 대상을 예측하여 저장한다.
캐시 적중률은 캐시 메모리 내 데이터 사용 유무 수로 측정한다.
C++에서 Delegate가 캐시 적중률이 낮은 이유?
Delegate로 이벤트 콜백 시,
그 콜백 함수들이 코드 영역에 따로 흩어져 존재하기 때문에 연속적인 메모리 접근이 어려움
→ 공간 지역성 측면에서 낮음
Unreal5의 Delegate
위 C++을 안정적으로 개선한 것이 Unreal의 Delegate.
Unreal Delegate 선언 매크로
분류기준은 구독-발행 형태가 1:1인지 1:다수인지/블루프린트 지원 유무/ 함수 형태에 따라 다르게 선언한다.
DECLARE(_델리게이트 유형)_DELEGATE(_함수정보)
1. 델리게이트 유형
1) 1:1 형태
2) 1:다수 형태
3) 1:1 형태, 블루프린트 지원
4) 1:다수 형태, 블루프린트 지원
2. 함수 정보
함수의 인자/반환값의 유무 / 값의 수에 따라 형태를 지정
Params로 인자 수를 지정, RetVal로 반환값을 지정한다.
1:다수 형태인 MULTICAST는 반환값을 지원하지 않는다.
Unreal Delegate
'UnrealEngine5 > 공부' 카테고리의 다른 글
[UE5] Dedicated server 전용 서버 독학하기 1) 공식 문서 튜토리얼 (0) | 2025.04.09 |
---|---|
[UE5] !!반환을 하는 이유 (0) | 2025.04.09 |
[UE5] UStruct와 UMap, Algo::Transform (0) | 2025.04.04 |
[UE5] Unreal Container_TArray와 TSet (0) | 2025.04.03 |
[UE5 / C++] 언리얼 C++ 시작하기 (0) | 2025.04.01 |