타워 디펜스 팀 프로젝트 이동 동기화 부분을 맡아 이에 대해 좀 더 고민을 많이 해보게 된 것 같다.
멀티 플레이에서의 이동 동기화를 구현해내기 위해 내가 선택할 수 있는 방법은 다음 3가지가 존재한다.
1) 프레임 단위 동기화
2) 서버-클라이언트 개별 시뮬레이션
3) 특정 지점 단위 동기화
이 방법의 경우, Client는 사실상 Renderer로서 View 역할만을 담당한다.
서버 안에서 모든 게임 데이터 로직을 가지고 있어, 해당 데이터 패킷들을 일정 프레임마다 클라이언트들에게 멀티캐스팅하는 방식이다.
이러한 구조적인 방식으로, 세 가지 동기화 방법 중 가장 서버에게 부하가 많이 가는 방식이기도 하다. 로직과 판정의 책임은 모두 서버에게 온전히 맡기면서 매 프레임별로 많은 패킷들을 처리해야 하기 때문에 퍼포먼스적인 성능과 시스템 부하 양쪽의 trade-off를 고려하여 균형을 맞추는 것이 중요하다. 유저가 느끼기에 자연스러운 동기화를 연출하면서 서버단에 무리가 가지 않는 적당한 Frame rate를 맞춰나가는 것이 중요하다.
이 방식과 아래 방식과 같은 경우, 구현에 있어서의 핵심적인 사항은
서버와 클라이언트가 동일한 로직을 공유해야만 한다.
라는 점이다.
서버와 클라이언트가 동일한 로직을 적용하는 데에 그치는 게 아니라, 완전히 신뢰성을 가지도록 로직 코드를 공유하는 형태를 가져야 한다.
그래서 게임 로직 실행될 때 서버와 클라이언트가 동일한 코드를 동시에 적용하여 이를 신뢰한다는 전제를 가지고 이용하는 방식이다.
이러한 기본 전제를 통해 알 수 있듯이, 클라이언트는 따라서 그래픽 랜더링 Rendering
적인 코드와 게임 로직
적인 코드에 대한 분리가 되어 있어야 한다.
2) 서버-클라이언트 개별 시뮬레이션
방식이 비단 동일한 코드를 사용한다고 하더라도 이에 대해 온전히 신뢰할 수 없는 것이 현실이다. 서버와 클라이언트 간에 결국에 시간 간극이 생기기 때문에, 특정 지점에서마다 검증을 반복하며 이에 대한 튜닝 과정을 추가한 방식이다.
여기서 중요한 건, 동기화를 위해 갑자기 teleport 시키는 행위는 유저에게 매우 불안정한 경험을 줄 수 있기 때문에, latency로 인해 밀린 구간에 대해 기존보다 매우 높은 속도를 적용하는 것과 같은 방식으로 노력이 필요하다.