RealtimeDestructibleMesh - Grid Cells System

조창근·2026년 2월 10일

RealTimeDestructibleMesh

목록 보기
2/4
post-thumbnail

FAB링크

발표자료

1.파괴 시스템에서 동기화의 문제

처음에는 파괴 후 분리된 메쉬(Connected Component)들에 고유 ID를 부여하여 서버와 연동하려 했습니다. 논리적으로는 완벽해 보였지만, 실제 테스트 결과는 참담했습니다. 원인은 바로 Floating Point(부동 소수점) 오차였습니다.

  • 문제점: 각 아키텍처(CPU/컴파일러)별로 Boolean 연산 시 발생하는 미세한 오차가 누적되어, 서버와 클라이언트에서 생성되는 메쉬의 ID 정보가 일치하지 않는 현상 발생.
  • 결과(Desync): 서버에서는 부서진 조각이 클라이언트에서는 붙어 있거나, 그 반대의 경우가 발생하여 물리 시뮬레이션과 게임 플레이의 정합성이 깨짐.

2. 레인보우 식스 시즈의 그리드 방식

고민 끝에 레인보우 식스 시즈의 기술 컨퍼런스 내용을 다시 복기했습니다. 레인보우 식스 시즈는 벽면(2D)을 그리드화하여 파괴를 관리합니다. 저는 이를 3D 공간으로 확장하여 메쉬 내부를 셀(Cell) 단위로 분할 관리하는 방식을 채택했습니다.

수학적으로 복잡한 메쉬의 정점 정보를 맞추려 노력하는 대신, "어떤 셀이 파괴되었는가"라는 확정적인 정수(Integer) 데이터를 동기화함으로써 오차 문제를 근본적으로 해결했습니다.

cell 근사 전 기본 메쉬

cell 분할을 적용한 메쉬(파란색이 Alive Cell,초록색이 Anchor Cell)


3.시각적 변화와 상태의 분리

RealtimeDestructure은 파괴 데이터를 두 가지 트랙으로 분리하여 전송합니다.

① 시각적 동기화 (클라이언트 비주얼)

  • CompactOp: "어느 위치에 어떤 모양으로 구멍을 뚫어라"라는 명령.
  • 실제 메쉬에 Boolean 연산을 수행하여 실시간으로 구멍이 뚫리는 시각적 피드백을 담당합니다.

② 구조 및 충돌 동기화 (실제 계산되는 데이터)

  • CellIds: "어떤 Cell들이 파괴되었는가"에 대한 확정적 상태 값.
  • 충돌 판정(Collision)과 구조적 무결성(Structural Integrity) 계산의 핵심 Truth 데이터가 됩니다.

서버에서의 처리 흐름
1. Boolean 처리 완료
2. MulticastApplyOpsCompact() → 메시 시각적 구멍 뚫기 (시각)
3. MulticastDestroyedCells() → Cell 상태 갱신 (충돌/구조 데이터)


4. 핵심 로직: MulticastDestroyedCells

서버에서 파괴된 셀의 ID 목록을 브로드캐스트하면, 클라이언트는 이를 받아 세 가지 핵심 작업을 수행합니다.

/** 파괴된 Cell ID 목록을 모든 클라이언트에 동기화 */
UFUNCTION(NetMulticast, Reliable)
void MulticastDestroyedCells(const TArray<int32>& DestroyedCellIds);

클라이언트 수신 시 프로세스:

  1. CellState 갱신: 내부 데이터 구조에서 해당 CellIdDestroyed 상태로 변경합니다. (서버와 1:1 일치)
  2. SuperCell 상태 업데이트: 대규모 파괴 시 성능 최적화를 위해 사용되는 DFS(깊이 우선 탐색)용 상위 노드(SuperCell) 정보를 갱신합니다.
  3. Collision Chunk 리빌드: 파괴된 셀 및 그 인접 셀들의 충돌체 경계면을 'Dirty'로 표시하고, 필요한 부분만 물리 엔진에 재반영합니다.


파괴 처리가 된 셀(빨간색은 Destroyed Cell)


5. 메쉬를 근사해보기 성공

메쉬의 정점 하나하나를 똑같이 맞추려 했던 방법을 버리고, 그리드 기반의 상태 동기화로 메시를 근사한 결과는 성공적이었습니다.

  • 결과: Floating Point 오차에서 자유로운 완벽한 네트워크 동기화 달성.
  • 이점:
    • 데이터 전송량 감소 (배열 형태의 정수 값만 전송)
    • 구조적 무결성 계산 로직의 단순화 및 성능 향상

다음 포스팅에서는 이 Cell 데이터를 활용해 파편 처리와 메쉬 아일랜드를 어떻게 제거 할 수 있었는지에 대해 다뤄보도록 하겠습니다.

0개의 댓글