Fast-Paced Multiplayer (파트 I) : 클라이언트 - 서버 게임 아키텍처

소개

빠르게 진행되는 멀티 플레이어 게임을 가능하게 하는 기술과 알고리즘을 탐구하는 기사 시리즈 중 첫 번째 기사입니다. 멀티 플레이어 게임의 개념에 익숙하다면 다음 기사로 건너 뛸 수 있습니다. 다음은 소개 토론입니다.

어떤 종류의 게임을 개발하는 것은 그 자체로 도전적입니다. 그러나 멀티 플레이어 게임에서는 완전히 새로운 일련의 문제가 추가됩니다. 흥미롭게도 핵심 문제는 인간 본성과 물리학입니다!

부정 행위의 문제

그것은 모두 속임수로 시작합니다.

게임 개발자는 일반적으로 플레이어가 싱글 플레이어 게임에서 속이는지 여부에 상관하지 않습니다. 그의 행동은 다른 사람에게 영향을 미치지 않습니다. 부정 행위자는 당신이 계획 한대로 정확하게 게임을 경험하지 못할 수도 있지만, 자신의 게임이기 때문에 어떤 방식 으로든 플레이 할 권리가 있습니다.

멀티 플레이어 게임은 다르다. 모든 경쟁 게임에서 부정 행위자는 자신의 경험을 향상시키는 것뿐만 아니라 다른 플레이어의 경험을 악화시킵니다. 개발자라면 플레이어를 게임에서 멀리 떨어 뜨리는 경향이 있으므로이를 피하고 싶을 것입니다.

부정 행위를 방지하기 위해 할 수있는 많은 일들이 있지만 가장 중요한 것 (그리고 아마도 유일한 의미있는 것)은 간단합니다. 플레이어를 신뢰하지 마십시오. 항상 최악의 경우를 가정합니다. 플레이어가 속이려고 시도합니다.

신뢰할 수있는 서버 및 DUMB 클라이언트

이것은 겉으로 보기에는 간단한 해결책으로 이 끕니다. 게임의 모든 것을 중앙 서버에서 제어 할 수있게 만들고 클라이언트가 게임의 특권을 얻은 관람자가되게합니다. 즉, 게임 클라이언트가 입력 (키 누름, 명령)을 서버에 보내고 서버가 게임을 실행하고 결과를 클라이언트에 다시 보냅니다. 이것은 일반적으로 권위있는 서버를 사용하여 호출됩니다. 왜냐하면 전 세계에서 일어나는 모든 일과 관련된 유일한 권한은 서버이기 때문입니다.

물론 서버가 취약점을 악용 될 수는 있지만 이는이 연재 기사에서 다루지 않습니다. 하지만 권위있는 서버를 사용하면 광범위한 해킹을 막을 수 있습니다. 예를 들어, 플레이어의 건강 상태로 클라이언트를 신뢰하지 않습니다. 해킹 된 클라이언트는 해당 값의 로컬 사본을 수정하여 10000 %의 상태를 플레이어에게 알릴 수 있지만 서버는 해킹 된 클라이언트가 생각할 수있는 것과 관계없이 플레이어가 공격 당하면 죽을 것입니다.

당신은 또한 세계에서의 지위를 가진 플레이어를 신뢰하지 않습니다. 그랬다면 해킹 된 클라이언트가 서버에 "내가 (10,10)에 있고"두 번째에 나중에 "(20,10)에"있다고 말하면서 벽을 통과하거나 다른 플레이어보다 빠르게 움직일 수 있습니다 . 그 대신에 서버는 플레이어가 (10,10)에 있다는 것을 알고, 클라이언트는 "나는 하나의 정사각형을 오른쪽으로 옮기고 싶다"라고 서버에 알리고, 서버는 (11,10)에 새로운 플레이어 위치로 내부 상태를 업데이트하고, 플레이어에게 "You 're at (11, 10)"이라고 응답합니다.
A simple client-server interaction.
요약하면 게임 상태는 서버 단독으로 관리됩니다. 클라이언트는 서버에 작업을 보냅니다. 서버는 주기적으로 게임 상태를 업데이트 한 다음 새로운 게임 상태를 다시 화면에 표시하는 클라이언트에게 보냅니다.

네트워크 다루기

벙어리 클라이언트 계획은 예를 들어 전략 게임이나 포커와 같은 느린 회전 기반 게임에서 잘 작동합니다. 또한 통신이 모든 실질적인 목적을 위해 즉각적으로 이루어지는 LAN 설정에서도 작동합니다. 그러나 이것은 인터넷과 같은 네트워크를 통해 빠르게 진행되는 게임에 사용될 때 고장납니다.

물리학에 대해 이야기 해 봅시다. 뉴욕에 있는 서버에 연결된 샌프란시스코에 있다고 가정합니다. 그것은 약 4,000km 또는 2,500 마일 (리스본과 모스크바 사이의 거리)입니다. 빛보다 빠르게 움직일 수있는 것은 없으며, 인터넷상의 바이트 (빛의 펄스, 케이블의 전자 또는 전자기파)가 아닙니다. 약 300,000 km / s의 속도로 여행하므로 4,000 km를 여행하는 데 13 ms가 걸립니다.

이것은 매우 빠르다고 들릴지 모르겠지만 실제로는 매우 낙관적 인 설정입니다. 데이터가 직선 경로의 빛의 속도로 이동한다고 가정 할 때, 대부분 그렇지 않을 가능성이 있습니다. 실생활에서 데이터는 라우터에서 라우터로 일련의 점프 (네트워킹 용어에서 홉 (hop)이라고 함)를 거치며, 대부분이 초고속으로 처리되지 않습니다. 라우터는 패킷을 복사, 검사 및 경로 변경해야 하므로 약간의 지연이 발생합니다.

논쟁을 위해서, 데이터가 클라이언트에서 서버로 50ms 걸린다고 가정 해 봅시다. 이것은 최상의 경우 시나리오에 가깝습니다. 도쿄에있는 서버에 연결된 NY에 있다면 어떻게됩니까? 어떤 이유로 네트워크 정체가 발생하면 어떻게해야합니까? 100, 200, 심지어 500ms의 지연은 전례가 없습니다.

예제로 돌아 가면 클라이언트는 서버에 입력을 보냅니다 ( "나는 오른쪽 화살표를 눌렀습니다"). 서버는 50ms 후에 가져옵니다. 서버가 요청을 처리하고 업데이트 된 상태를 즉시 반환한다고 가정 해 보겠습니다. 귀하의 고객은 50ms 후에 새로운 게임 상태 ( "지금 (1, 0)에 있습니다")를 얻습니다.

당신의 관점에서, 일어난 일은 당신이 오른쪽 화살표를 눌렀지만 1 초에 10 분 동안 아무 것도 일어나지 않았다는 것입니다. 당신의 캐릭터는 마침내 한 칸 오른쪽으로 움직였습니다. 입력과 그 결과 사이의 지각 된 지연은별로 들리지 않을 수 있지만 눈에 띄지 않습니다. 물론 0.5 초의 지연은 눈에 띄지 않을뿐 실제로 게임을 재생할 수 없게 만듭니다.

요약

네트워크 멀티 플레이어 게임은 놀랍지 만 재미 있지만 전혀 새로운 차원의 도전을 불러 일으 킵니다. 권위있는 서버 아키텍처는 대부분의 치트를 멈추게하는 데는 능숙하지만, 간단한 구현으로 인해 게임이 플레이어에게 상당히 반응하지 않을 수 있습니다.

다음 기사에서는 권위있는 서버를 기반으로 시스템을 구축하면서 플레이어가 겪는 지연을 최소화하면서 로컬 또는 단일 플레이어 게임과 거의 구별 할 수없는 방법을 탐색 할 것입니다.

댓글 없음:

댓글 쓰기