네트워크 지연 시간 소개
서버와 클라이언트 사이의 거리, 패킷 홉, 서버의 틱 및 업데이트 속도등 다양한 문제가 멀티플레이어 랙의 원인이며, 이를 해결하는 방법은 다음과 같습니다.
온라인 게임에는 싱글플레이어 또는 LAN 전용 게임에서는 걱정할 필요가 없는 지터, 왕복 시간(RTT) 또는 패킷 손실과 같은 문제가 있습니다.
클라이언트와 서버 간의 정보 전송, 수신, 대기열 대기 사이에 지연이 발생하면 게임플레이에 문제가 발생할 수 있습니다. 정의 및 문제점에 대한 전체 목록은 여기에서 이 가이드를 확인하세요.
지연 문제를 성공적으로 해결하려면 다음 요소 간의 우선순위와 관계를 고려해야 합니다:
1. 보안
2. 반응성
3. 정확성 및 일관성
완벽한 솔루션은 없으며 지연 문제에 접근하는 모든 방법에는 장단점이 있습니다. 핵심은 게임에 가장 적합한 방법을 찾는 것이며, 이 가이드는 이러한 결정을 내리는 방법을 이해하는 데 도움이 될 것입니다.
권한은 클라이언트-서버 관계에서 오브젝트에 대한 최종 게임플레이 결정을 내릴 권한을 가진 사람을 정의합니다. 선택한 권한 모델은 게임의 네트워크 지연 시간에 영향을 미칩니다.
멀티플레이어 게임에는 두 가지 권한 유형이 있으며, 각각은 보안, 반응성, 일관성과 관계가 있습니다:
- 서버 권한: 더 안전하고, 반응이 느리고, 동기화 문제가 없습니다.
- 클라이언트 권한: 보안이 취약하고 반응성이 떨어지며 동기화 문제가 발생할 수 있습니다.
클라이언트 측에 존재하는 모든 코드가 변조될 수 있으며, 플레이어는 서버로 전송되는 네트워크 메시지를 위조할 수 있습니다.
이것이 게임에서 어떻게 보일지 알고 싶다면 특정 거리에서는 임프를 죽일 수 없는 게임의 예를 생각해 보세요.
클라이언트 로직에서 10미터 이상 떨어진 임프를 죽일 수 없다고 지정했지만 "임프 죽이기" 메시지가 서버 측에서 거리를 확인하지 않는 서버 RPC인 경우, 플레이어는 해당 네트워크 메시지를 위조하여 클라이언트 측 로직을 우회할 수 있습니다.
안타깝게도 일부 사람들은 항상 게임을 망치려고 시도하기 때문에 클라이언트를 완전히 신뢰할 수는 없다는 점을 항상 염두에 두어야 합니다. 불쌍한 임프와 게임을 플레이하는 다른 모든 플레이어를 위해 서버에는 클라이언트로부터 오는 플레이어의 행동을 검증하는 로직이 필요합니다.
권한 모델 및 지연 시간
선택한 권한 모델은 게임의 네트워크 지연 시간에 영향을 미칩니다. 두 가지 권한 유형과 보안, 반응성 및 일관성과의 관계를 검토해 보겠습니다.
서버 권한 게임에서는 모든 최종 게임플레이 결정이 서버에서 실행됩니다.
보안 ✅
캐릭터의 체력이나 포지션과 같은 중요한 데이터는 서버에서 권한을 부여하여 부정 행위자가 함부로 건드리지 못하도록 할 수 있습니다. 이 경우 서버가 해당 데이터의 값에 대한 최종 결정권을 갖게 됩니다.
일관성 ✅
서버 권한 게임의 장점은 월드의 일관성입니다. 모든 게임플레이 결정은 네트워크의 동일한 노드(서버)에서 이루어지므로, 이러한 결정이 동시에 이루어지도록 할 수 있습니다.
반응성 🚫
서버 권한의 문제는 서버가 월드 업데이트를 지시할 때까지 기다려야 한다는 것입니다. 하지만 서버 권한을 유지하면서 이 문제를 해결하는 데 사용할 수 있는 패턴이 있으니 계속 지켜봐 주세요.
클라이언트 권한 게임에서는 여전히 월드 상태를 공유하는 데 사용되는 서버가 있지만, 클라이언트는 자신의 현실을 소유하고 강요할 수 있습니다.
반응성 ✅
클라이언트 권한 모델은 사용자 또는 사용자의 디바이스를 신뢰할 때 자주 사용할 수 있으며, 반응성에 유용한 모델입니다. 클라이언트 자체에서 모든 중요한 게임플레이 결정을 내리기 때문에 사용자 입력이 발생하는 즉시 결과를 표시할 수 있습니다.
일관성 🚫
클라이언트 권한이 있는 게임에서 동기화 문제가 발생할 수 있습니다. 클라이언트가 오래된 정보를 사용하여 권위 있는 결정을 내릴 경우 동기화 해제, 물리 오브젝트 겹침 및 기타 문제가 발생할 수 있습니다.
보안 🚫
클라이언트 권한은 악의적인 플레이어가 게임에서 승리하기 위해 메시지를 위조할 수 있기 때문에 서버에 열어두면 매우 위험한 문입니다.
서버 권한이 있는 게임의 지연 시간 문제 해결
멀티플레이어 개발의 모범 사례는 일관성과 보안을 위해 서버 권한 모델을 채택하는 것입니다. 이러한 게임에서 지연 시간을 관리하기 위한 네 가지 주요 전략을 살펴보겠습니다.
기능을 디자인할 때는 서버 권한을 기본값으로 사용한 다음 반응성이 필요하고 보안이나 월드 일관성에 큰 영향을 미치지 않는 기능을 식별하세요.
사용자 입력이 좋은 예입니다. 사용자가 이미 자신의 입력을 소유하고 있기 때문에(내가 누른 키는 내 것이므로 서버가 "아니요, W키를 누르지 않았습니다"라고 말할 수 없습니다) 사용자 입력 데이터는 쉽게 클라이언트 주도로 처리할 수 있습니다.
FPS 게임에서 룩 연출은 큰 영향 없이 클라이언트에 의해 쉽게 결정될 수 있습니다. 클라이언트는 마우스 움직임 대신 보기 방향을 서버로 전송합니다. 외모가 수정되면 어색하게 느껴질 수 있고 보안에 문제가 생길 수 있습니다.
예측을 통해 게임 서버의 신뢰성을 유지하면서 대응력을 높일 수 있습니다. 클라이언트는 액션 결과를 위해 전체 RTT를 기다리는 대신 플레이어의 트리거 입력을 예상하는 게임플레이 코드를 시뮬레이션하고 실행합니다.
예측에 오류가 발생했을 때 '조정'이 중요한 역할을 합니다. 클라이언트는 예측한 포지션의 기록을 보관하며, 서버의 권한이 있기 때문에 클라이언트는 서버에서 전송되는 포지션을 계속 수신합니다. 클라이언트는 과거에 예측한 포지션이 서버에서 가져온 이전 포지션과 일치하는지 검증합니다.
그러면 클라이언트는 불일치를 감지하고 서버의 권위 있는 위치에 따라 위치를 수정할 수 있습니다.
참고: 이 메서드는 현재 게임 오브젝트용 넷코드에서 완전히 지원되지 않습니다.
서버 권한 게임플레이 코드가 클라이언트 측(예측 기능 포함)과 서버 측 모두에서 실행되지 않는 데에는 여러 가지 이유가 있습니다. 하지만 어떻게 하면 던지기가 반응성이 있고 클라이언트가 입력에 반응하는 것을 확인하기 전에 전체 RTT를 기다릴 필요가 없도록 할 수 있을까요?
지연 숨기기에 자주 사용되는 트릭은 플레이어 입력에 따라 애니메이션, 사운드 또는 VFX에 영향을 주지 않는 게임플레이를 즉시 트리거하지만 나머지 액션은 서버가 권한 있는 게임플레이 요소를 구동할 때까지 기다리는 것입니다.
서버의 상태가 다른 경우 클라이언트 측에서 발생하는 최악의 상황은 짧지만 쓸모없는 애니메이션을 재생한 것입니다. 애니메이션을 완료하거나 취소하는 것은 간단합니다. 이를 액션 캐스팅 또는 액션 예상이라고 합니다.
서버 되감기는 서버의 권한을 유지하기 위해 클라이언트 기반 기능에 대한 보안 점검입니다.
클라이언트는 입력과 함께 서버에 "t 시점에 목표에 도달했습니다"라는 메시지를 보냅니다. t+RTT/2 시점에 이를 수신한 서버는 t-RTT 시점에 시뮬레이션을 되감고, 샷을 검증한 후 최신 시점의 월드 수정(즉, 타겟 처치)을 수행합니다. 이를 통해 플레이어는 월드가 일관된 느낌을 주면서도 보안과 서버의 권위를 유지할 수 있습니다.
참고: 게임 상태의 서버 되감기는 모두 같은 프레임에서 이루어지며 플레이어에게는 보이지 않습니다. 서버 측 검사로, 클라이언트가 수행해야 할 작업의 유효성을 검사할 수 있습니다.
참고: 이 메서드는 현재 게임 오브젝트용 넷코드에서 완전히 지원되지 않습니다.
멀티플레이어 게임을 제작하는 것은 어려운 작업이지만 흥미진진한 작업이기도 합니다. 차세대 배틀로얄 대작을 만들든, 아늑한 온라인 협동전을 만들든 지연 시간의 뉘앙스와 관리 방법을 이해하는 것은 필수입니다.
지금 바로 다음 프로젝트를 시작하려면 멀티플레이어 문서를 확인하세요.