[UE4/UE5] Replication Graph - GridSpatialization2D Node

2023. 8. 8. 02:16언리얼이 리얼보다 쉬웠어요

 

이전글

[UE4/UE5] Replication Graph

 

 

그리드 공간화 노드

 

리플리케이션 그래프에서 기본적으로 제공하는 노드 중 GridSpatialization2D라는 네이밍의 글로벌 노드가 있다.

 

 

간결하게 쓰면 구역을 임의로 나누고 내가 서 있는 구역에 속한 액터들만 수집한다는 개념이다.

월드를 그리드 셀이라는 하위 노드로 분할하여 각 셀 안에 조건에 맞는 액터들을 담고, 플레이어는 자신이 현재 위치한 셀 내의 액터 리스트만 노드에서 수집하게 된다. 물론 각 셀의 크기나 그리드의 시작점은 직접 세팅해줄 수 있다. 그리드의 바운드를 설정할 수도 있는데 바운드를 설정할 경우 바운드 밖의 액터는 가장 가까운 셀에 고정된다.

처음부터 모든 셀이 초기화되는 건 아니고, 현재 셀이 생성되어 있지 않은 위치에 액터가 스폰되면 미리 지정해둔 그리드의 시작점과 셀 사이즈를 바탕으로 한 계산식에 의해 셀 노드가 추가된다. 그리고 이 셀의 크기를 적절하게 세팅해주는 것 또한 중요하다. 액터의 현재 위치와 글로벌 액터 정보(이전글 참고) 기준 CullDistanceSquared를 토대로 연산하여 액터 데이터가 셀에 들어가게 되는데, 이 과정에서 하나의 액터 데이터가 다수의 셀에 들어갈 수 있기 때문.

 

 

예를 들어 쿼카의 넷 컬 디스턴스 범위가 청록색 원과 같다고 치면, 총 6개의 셀이 그 범위에 걸치기 때문에 쿼카의 액터 정보는 총 6개의 셀에 중복으로 들어가게 된다. 그렇다면 이 경우 실제 리플리케이트는 어떻게 될까?

 

 

플레이어 A의 경우

1. 플레이어 A가 서 있는 (1,2) 셀에서 액터를 수집해온다.

2. (1,2) 셀 노드 안에는 쿼카의 액터 정보가 포함되어 있다.

3. 하지만 Priority 계산 단계에서 플레이어 A에게 쿼카는 디스턴스 컬링 대상이므로 최종 리플리케이트 대상에서는 제외된다.

 

플레이어 B의 경우

1. 플레이어 B가 서 있는 (2, 3) 셀에서 액터를 수집해온다.

2. (2, 3) 셀에도 쿼카의 액터 정보가 포함되어 있다.

3. 플레이어 B는 쿼카의 컬링 거리 안에 들어오므로 최종적으로 플레이어 B에게 쿼카는 리플리케이트된다.

 

즉 기본적으로 액터 수집 단계에서 단일 셀에서만 데이터를 수집해오는 것은 맞다.

다만 액터의 정보 자체가 꼭 단 하나의 셀에만 들어가는 것은 아니다.

또한 셀 안에 있는 모든 액터 데이터가 꼭 커넥션에게 최종적으로 리플리케이트되는 것 또한 아니다.

 

그렇기 때문에 셀 크기를 너무 늘리면 불필요한 연산이 늘어날 수 있고, 셀 크기를 너무 줄이면 중복되는 데이터가 필요 이상으로 쌓이게 된다. 프로젝트마다 적절한 세팅값을 찾아주는 것이 중요해진다.

 

Static, Dynamic, Dormancy

 

그리드 셀 노드는 크게 세 가지의 하위 노드로 다시 나뉜다.

 

Static Dynamic Dormancy
- 움직이지 않는 액터를 담아두는 노드
- 셀을 이동할 일이 없으므로 지정된 리스트를 반환
- 움직이는 액터를 담아두는 노드
- 매 업데이트마다 액터들의 현재 셀 범위를 체크하고 갱신
- 휴면중인 액터를 담아두는 노드
- 리플리케이트 대상에서 제외

 

액터가 노드에 추가되는 순간, 어느 노드로 라우팅시킬지 지정할 수 있는데,

(슈터게임(그리고 포트나이트) 코드의 경우 클래스 세팅을 할 때 '이 클래스의 액터는 이 노드로 갈 것이다'는 매핑을 미리 해두고 있다.)

그리드 노드의 경우 처음 추가될 때 어느 노드로 들어가도록 라우팅하냐에 따라서 상당히 큰 차이가 있다.

 

처음부터 Static 노드에 라우팅한 액터는 휴면 상태가 변경될 때마다 Dormancy 노드로 이동하거나 Static 노드로 돌아온다.

처음부터 Dynamic 노드에 라우팅한 액터는 휴면 상태 관련 처리가 되지 않는다.

처음부터 Dormancy 노드에 라우팅한 액터는 휴면 상태가 변경될 때마다 Dynamic 노드로 이동하거나 Dormancy 노드로 이동한다.

 

로직의 큰 흐름을 축약해서 나타내면

 

 

그리고 이 흐름을 더더욱 실전압축시킨 것이...!

 

 

눈여겨봐야 할 포인트는 처음부터 Dynamic 노드로 라우팅시키면 Dormancy 노드로는 갈 수 없다는 것이다.

휴면 가능성이 있는 액터는 처음부터 Dormancy로 라우팅해주는 것이 좋다.

 

 

이번엔 중요하다고 생각되는 포인트 위주로 작성했지만 이 외에도 그리드 노드엔 더 많은 디테일이 있다.

우선 간략하게나마 한눈에 볼 수 있도록 정리해본 게 위의 이미지.

그리드 노드는 프로젝트의 성향이나 규모에 따라 상당히 큰 효과를 볼 수 있고 이렇게 저렇게 써보면서 프로젝트에 최적화된 형태를 찾는 것도 재밌는 과정이다.