데드레커닝 기법
실시간 게임 환경에서 클라이언트들이 통신할 때 가장 이상적인 방법은 매 프레임(60프레임 기준으로 60번) 통신하는 것입니다.
이 경우 데이터의 정확도는 올라가지만 네트워크 통신량이 엄청나게 상승하게 됩니다.
이때 데드레커닝 기법 사용하면 네트워크 통신량을 줄이고 데이터의 정확도를 보장할 수 있게 됩니다.
알고리즘
데드레커닝 알고리즘은 신호가 오지 않는 동안의 행동을 클라이언트에서 추측하여 상태를 갱신하는 알고리즘입니다.
A 플레이어가 앞으로 1초 동안 이동하고, 1초 후에 오른쪽으로 방향을 바꾸어 이동한다고 가정할 때
매 프레임 통신하면
클라이언트에서는 서버로 앞으로 가는 키를 누르고 있다는 메시지를 120번(60프레임 * 2) 보내고 중간에 방향을 바꿀 때 방향을 바꾼다는 메시지 1번 보내 총 121번의 메시지를 보냅니다.
서버 또한 클라이언트가 보낸 메시지를 기반으로 매 프레임 클라이언트의 위치값을 갱신하여 메시지를 120번(60프레임 * 2) + α번 보내야 합니다.
데드레커닝 알고리즘을 적용하면
클라이언트는 앞으로 가는 키를 눌렀을 때 1번 메시지를 보내고, 중간에 방향을 바꾸는 키를 눌렀을 때 다시 1번 메시지를 보내고, 앞으로 가는 키를 땠을 때 1번 메시지를 보내 총 3번의 메시지만 서버로 송신하면 이동을 처리할 수 있습니다.
서버에서는 이동을 시작했을 때의 클라이언트의 위치값과 이동방향을 클라이언트로 보내고, 방향을 바꾸었을 시점에 클라이언트의 위치값과 이동방향을 다시 1번 보내고, 이동을 멈추었을 때 클라이언트의 위치값을 다시 1번 보내 3번의 메시지만 클라이언트로 송신하여 이동을 처리할 수 있습니다.
클라이언트와 서버 모두 동일한 이동속도 값을 가지고 있으면 해당 이동속도와 이동 방향을 근거로 각각 플레이어의 위치를 연산할 수 있고, 서버에서는 클라이언트에서 상태가 바뀌었다는(방향이 바뀌었다는, 이동을 멈추었다는 등...) 메시지에 대해 응답할 때마다 서버에서 연산한 현재 클라이언트 위치값을 보내 클라이언트와 서버의 동기화가 이루어질 수 있습니다.
클라이언트가 해킹당해 변조된 이동속도 값을 가지고 있다고 해도, 서버에서는 클라이언트에 변화가 있을 때마다 동기화를 위해 값을 송신하므로 클라이언트가 변조되었을 때의 위험도 적습니다.
즉 서버와 클라이언트가 동시에 연산을 수행하되 서버에서 연산한 결괏값을 정기적으로 혹은 클라이언트에서 현재 상태와 다른 변화가 일어날 때마다 동기화를 시켜주는 방법입니다.
뒤끝매치에 적용하기
뒤끝매치의 실시간 게임 환경의 경우 서버에서는 연산을 수행하지 않고 단순히 릴레이 서버로서의 기능만 수행합니다.
때문에 P2P 방식과 유사하게 게임을 만드는 것을 권장하고 있습니다.
또한 P2P 방식에서도 Super peer 방식을 사용하여 연결된 클라이언트 중 호스트(서버) 역할을 할 클라이언트 하나를 선정하여 호스트 클라이언트는 자기 자신의 키 입력값과 게임의 전체적인 연산을 수행하고, 다른 클라이언트들은 호스트로 키 입력값을 보내고, 호스트의 연산 결괏값을 수신 받아 클라이언트에 적용하는 방식을 권장합니다.
데드레커닝 기법을 적용하면 호스트에서 클라이언트로 보내는 통신량을 줄일 수 있습니다.
호스트 클라이언트
호스트 클라이언트는 자신의 키값은 전송하지 않고 내부에서 처리하며, 다른 클라이언트들이 보낸 키값 또한 일렬의 게임 로직으로 처리합니다.
그리고 게임 로직을 통해 처리된 값을 서버로 전송하여 다른 클라이언트들에게 브로드캐스팅 하는 방식을 사용합니다.
일반 클라이언트
일반 클라이언트는 서버로 키값을 보내고, 서버에서 브로드캐스팅 된 메시지 중 호스트가 아닌 클라이언트가 보낸 메시지는 무시하고, 호스트가 보낸 메시지를 디시리얼라이즈를 수행하여 게임에 적용시키면서 동기화하는 방식을 사용합니다.
- 호스트가 보낸 메시지에는 클라이언트들의 상태와 동기화 값이 들어있습니다.
- 이 상태 값을 기반으로 클라이언트 자체에서 연산을 수행하면서 호스트가 메시지를 보낼 때마다 데이터를 동기화하는 방식을 사용합니다.
- 어떤 클라이언트도 호스트가 될 수 있습니다. 그렇기에 게임 로직이 클라이언트에 포함되어 있어 클라이언트에서도 연산을 수행할 수 있습니다.