Game Development, 게임개발/게임네트워크

멀티 플레이 환경에서의 클라이언트와 서버 - 1, 구조

게임이 더 좋아 2022. 5. 10. 23:48
반응형
728x170

 

서버와 통신하는 이유는 여러 가지가 있겠지만

멀티 플레이 환경에서 가장 첫 번째 이유는 공정성이다.

싱글 플레이에서 유저가 어떤 행동을 하든 조작을 하든 다른 유저에게 피해를 끼치지 않는다.

 

https://www.inven.co.kr/board/overwatch/4538/2749047

 

 

저러면 게임이 하고 싶을까?

 

각 방마다 저러면 내가 게임을 할 수 있을까?

 

 

클라이언트를 직접 조작하는 것은 막지 못한다.

하지만 서버와의 연결을 거친다면 클라이언트의 변조를 막을 수 있다.

이것이 멀티 플레이 게임의 가장 중요한 요소인 공정성이다.

모두 다 같은 환경에서 플레이해야만 멀티플레이의 의미가 생기는 것이다.

 


 

쉽게 생각하면 모든 게임의 연산을 서버에서 하면 되는거 아냐? 라고 생각한다.

 

이것을 Authoritative Server라고 하는데

이는 서버에서 연산을 처리하여 클라이언트가 받아서 쓰는 방식이다.

물론 서버도 만능은 아니다.

]서버에도 약점이 생길 수 있다.

하지만 우리는 거기까지 다루지는 않을 것이고

대부분의 게임에서 Authoritative Server를 쓰는 이유를 알아볼 것이다.

 

Authoritative Server는 앞서 말한대로 공정성을 유지하는데 큰 도움을 준다.

다시 말해서 우리가 소위 말하는 많은 핵들을 막을 수 있다.

 

클라이언트가 조작되었든 말든 상관이 없다.

어차피 서버는 클라이언트에서 오는 것을 믿지 않는다.

서버에서 World State를 가지고 있기 때문에

클라이언트가 조작된 데이터를 보내도 서버는 전혀 영향을 받지 않는다.

플레이어의 체력을 100보다 크게 조작해도 서버는 플레이어의 체력이 100인 것을 알고 있으며

플레이어의 위치를 하늘 위로 옮겨도 서버는 플레이어가 땅 위에 있다는 것을 알고 있다.

클라이언트는 서버의 상태를 전혀 바꿀 수 없는 구조다.

 

 

간단한 통신을 보자면

클라이언트는 오른쪽으로 한칸 움직이면 바로 움직이는 것이 아니라

서버에 내가 움직인다고 보내고 서버의 World State를 받아와 내 컴퓨터에 렌더링하는 것이다.

클라이언트는 그저 서버의 응답에 대한 동작만 하는 것이다.

 

하지만 클라이언트가 아무것도 하지 않는 멍청한 상태, dumb client가 된다면 비효율의 끝이다.

컴퓨터가 켜져있음에도 아무 연산도 하지 않고 그냥 서버만 주구장창 기다리는 것이다.

 

턴제 게임이라면 멀티플레이 게임이라도 괜찮을만 하다.

고스톱, 포커 등이 괜찮다.

하지만 서든어택과 같은 0.2초의 반응을 요구하는 게임이라면?

절대 저렇게 하면 안된다.

 

뭐 서든이야 국산게임이니

서버가 국내에 있어서 패킷이 이동해봤자 거기서 거기라고 100번 양보해서 그렇다고 하자.

 

그렇다면 외국에 서버를 두고 있다면?? 

실리콘 밸리에 서버가 있다면??

 

빛의 속도로 움직인다고 해도 10ms 이상 걸린다.

**물론 글로벌 게임은 서버를 Region마다 두고 있다.

 

10ms가 빠르다고 생각할 수 있다.

물론 빠른 것은 맞다.

하지만 저것은 진짜 패킷이 유실되지 않고 최적의 경로만 찾아와서 받았을 경우다.

 

만약 유실이 되거나 돌아서 온다면??

 

10ms는 우습게 넘을 것이다.

빛의 속도로 움직이더라도 경로가 잘못되면 오래 걸린다는 말이다.

대충 외국의 핑을 생각해봤을 때 100ms 걸린다고 쳐보자.

0.1초다.

 

외국에 있는 애들은 0.01초만에 방향키 반응을 하는데

나는 적을 보고도 0.1초 늦게 움직여서 총알이 머리에 박힌다.

결국 게임이 재미없어지고 게임을 끄게 된다.

 

이게 진짜 최선일까?

우리는 멀티 플레이 게임을 하기 위한 몇가지 방법이 있다.다음 글에서 알아보자

 


참고링크

https://www.gabrielgambetta.com/client-server-game-architecture.html

반응형
그리드형