Post

[Project Arc/R&D] 네트워크 최적화를 위한 서버와 클라이언트의 효율적 분리 생성 방식 실험

이번 실험에서는 Seed를 활용하여 서버와 클라이언트가 각자의 환경에서 동일한 지형을 독립적으로 생성하는 구조가 가능한지 검증하고자 합니다.

[Project Arc/R&D] 네트워크 최적화를 위한 서버와 클라이언트의 효율적 분리 생성 방식 실험

랜덤 기반의 지형을 생성하는 시스템을 구현할 때 가장 먼저 고려해야 하는 것은 서버와 클라이언트 간의 동기화 방식입니다. 기존의 대부분 게임은 지형이 사전에 제작되어 있기 때문에, 서버와 클라이언트가 동일한 지형 데이터를 공유하며 단순히 이를 메모리에 불러오는 것만으로 문제가 해결됩니다.

그러나 지형이 실시간으로 랜덤하게 생성되는 구조라면, 서버와 클라이언트 모두에서 동일한 결과의 지형이 생성되도록 보장하는 로직이 필요합니다. 이를 구현하는 한 가지 방법은 서버가 모든 지형 데이터를 생성하고, 이를 클라이언트로 Replicate하여 전달하는 것입니다. 하지만 이 방식은 네트워크 대역폭과 성능 측면에서 상당한 비용이 발생할 가능성이 높습니다.

따라서 이번 실험에서는 Seed(시드)를 활용하여 서버와 클라이언트가 각자의 환경에서 동일한 지형을 독립적으로 생성하는 구조가 가능한지 검증하고자 합니다. 서버, 클라이언트, 그리고 서버+클라이언트 환경 각각에서 지형을 생성하고, Collision(충돌 처리)이 정상적으로 작동하며 예상한 대로 일관된 결과를 보이는지 실험을 진행했습니다.


실험 방법

  • 블루프린트를 통해 발판이 될 Actor를 각각 생성
  • Client, Server, Server+Client(Replicated)를 각각 생성
  • Client의 캐릭터를 이동시켜 의도된대로 동작하는 지 확인
  • 그 후 Client와 Server용으로 생성된 액터를 동일한 위치에 스폰시켜 의도된대로 동작하는지 확인

검증

모든 검증 절차에서 게임이 양쪽에 있는 경우에는 왼쪽이 Server(Host) 오른쪽은 Client 입니다.

1. Client 환경에서 생성된 Actor Collision 동작 검증

Replicate된 액터의 경우, 충돌이 정상적으로 동작하며 서버와 클라이언트 간 Desync(비동기화)가 발생하지 않았습니다. 반면, 클라이언트 전용으로 생성된 액터는 충돌 판정이 무시되거나 불안정하게 동작하는 문제가 있었으며, 이는 물리 연산이 서버 권한(Authority)을 기준으로 처리된다는 Unreal Engine의 기본 구조와 일치합니다.

2. Client와 Server에서 각각 생성된 액터를 동일한 위치에 생성했을 경우

Replicaed Actor와 동일하게 동작하는 것을 확인할 수 있었습니다. 따라서, 구상한 Seed를 기반으로 Server와 Client가 각각 지형을 생성하는 것에 문제가 없음을 확인했습니다. 이는 네트워크를 통해 대량의 지형 데이터를 전송하지 않고도 동일한 결과를 재현할 수 있음을 의미합니다.

3. 1번과 동일한 세팅이지만 높이가 낮을 경우 (Character Movement의 Max Step Height 보다 낮을 경우)

Client에서만 생성된 Actor에서는 이전과 동일하게 Desync가 발생했지만, Server에서만 생성된 Actor는 완전히 무시되는 것을 확인할 수 있었습니다.


결론

이번 실험을 통해 Seed 기반 랜덤 지형 생성 시스템의 동기화 가능성을 검증한 결과, 다음과 같은 결론을 얻을 수 있었습니다.

  1. Seed 기반 동기화 접근은 충분히 유효하며, 지형 데이터의 네트워크 전송 없이도 서버-클라이언트 간 일관된 결과를 유지할 수 있음이 확인되었습니다.

  2. Collision 및 물리 연산은 반드시 서버 권한에서 수행되어야 하며, 클라이언트에서 단독으로 생성한 액터는 신뢰할 수 없습니다.

  3. 따라서, Seed 동기화를 통해 지형의 형태와 구조를 공유하되, 물리 및 충돌 관련 연산은 서버에서만 권한을 유지하는 하이브리드 구조가 가장 효율적인 설계로 판단됩니다.

This post is licensed under CC BY 4.0 by the author.