Chapter 2. Network 게임 개발하기 전 정리

개발하는 운동인·2025년 2월 14일

✅ 먼저 4인 플레이어 멀티 플레이어 게임은 총 몇명의 플레이어가 존재할까?

  • 플레이어 A,B,C,D가 참가하는 4인 멀티플레이어 게임은 총 16명의 플레이어가 존재한다.

⭐ 왜 16명의 플레이어가 존재할까? 이해해보자.

  • 4인 플레이어라는 것은 4개의 컴퓨터가 존재한다.

⭐ 4대의 컴퓨터가 통신을 한다.

⭐ 통신을 하면서 만들어진 세상은 1개 일까? 4개의 게임 세상이 존재한다.

  • 컴퓨터 1대 당 게임 세상이 1개가 존재한다. 즉, 4개의 게임 세상이 존재한다.
  • A라는 게임 세상 안에 A,B,C,D 플레이어가 존재.
  • B 라는 게임 세상 안에 A,B,C,D 플레이어가 존재.
  • C 라는 게임 세상 안에 A,B,C,D 플레이어가 존재.
  • D라는 게임 세상 안에 A,B,C,D 플레이어가 존재.

👉 즉, 16명의 플레이어가 존재한다. 중요한 점은, 컴퓨터에서 게임 세상이 만들어지는 것이다.

각 컴퓨터 게임 세상에 대표하는 대표자. 즉, Owner가 있다. (Local Player)

  • A라는 컴퓨터 게임 세상에 앞에 앉아 있는 A. 즉, 쉽게 말해 컴퓨터 주인인 A가 있다. 이러한 플레이어를 로컬 플레이어라고 부른다.

⭐ 대표자가 아닌 플레이어가 존재한다.(Remote Player)

  • 원격 플레이어가 존재한다. A라는 세상이 아닌 다른 세상에서 건너온 플레이어를 말한다. 정확하게 얘기하면 다른 게임 세상에 분신이라 생각하면 된다.

✅ A,B,C,D라는 각 세상에서 하나의 게임 세상처럼 동기화가 될까?

  • 먼저, A 게임 세상에서 A는 Local Player이고, 나머지 B,C,D는 Remote Player이다.
  • B,C,D 게임 세상에서 A는 A게임 세상에 있는 Remote Player 이다. (분신)

A 게임 세상에 있는 Local Player A가 다른 게임 세상에 있는 Remote Player A 들에게 싱크를 맞추기 위해 동기화를 건다.

  • 무슨 말이냐면, A 게임 세상에 있는 A의 정보들을 다른 게임 세상에 있는 Remote Player A 들에게 넘긴다.

👉 A 게임 세상에서 A가 움직이면 다른 게임 세상에 있는 A들도 같이 움직일 것 이다. 중요한 점은, 다른 게임 세상에 있는 A는 진짜가 아닌 분신이다. Remote Player이다. 다른 게임 세상에 있는 A는 A게임 세상에 있는 A의 정보들을 받아서 동기화만 할 뿐이지 별개의 오브젝트이다.

✅ 만약 동기화가 안되면?

  • A 게임 세상에서의 A 플레이어가 B 게임 세상에서의 A 플레이어 간의 동기화가 되질 않는다면 서로 다른 기능을 취할 것 이다.
  • 각 A는 다른 A이고, 동기화만 거는 관계이다.

✅ 잠깐 정리

    1. 4명의 플레이어를 A,B,C,D 가 있을 때 , 게임 세상 A - 게임 세상 B - 게임 세상 C - 게임 세상 D 로 나뉘어 지고, 각 게임 세상안에 A,B,C,D 모두 존재한다.
    1. 게임 세상 A에서의 로컬 플레이어는 A, 게임 세상 B에서의 로컬 플레이어는 B ...
    1. 각 게임 세상에서 로컬 플레이어가 아닌 플레이어들을 Remote Player라고 부른다.
    1. LocalPlayer가 다른 게임 세상에 분신으로 존재하는 플레이어에게 동기화를 건다. 싱크를 맞춘다. ex) A 게임 세상에서 A가 B 게임 세상에 있는 A에게 정보를 넘기고, 정보를 받은 B 게임 세상 A가 싱크를 맞춘다.

✅ 서버-클라이언트와 권한 분리

  • 호스트로서 서버가 참가하는 방식
  • 서버가 데드케이트 서버가 되는 방식
  • 핵이나 버그를 쓰는 플레이어들이 게임을 망가뜨릴 수 없도록 서버에게 모든 처리를 몰아주는 방법도 알아야 함!
  • 네트워크 서비스들은 기본적으로 서버 - 클라이언트 방식으로 이루어져 있다. 서버는 기본적으로 어떠한 한 곳에 고정되어 있고 서비스를 제공하는 컴퓨터이다. 클라이언트는 서버로 찾아가서 서비스를 받는 컴퓨터들을 말한다. ex) 클라이언트는 어떤 게임 세상에서 플레이 할 플레이어를 의미하고, 서버는 플레이어가 플레이 할 수 있는 게임 세상을 의미

👉 서버는 하나지만, 그 서버에 접속하는 클라이언트들은 여러개가 있다.

⭐ 서버 - 클라이언트 방식을 게임에 적용하기 (2가지 소개)

    1. 서버 그 자체도 1명에 플레이어로써 게임에 참가한다 : Host로써 플레이를 한다. ex) 서버가 호스트인데 호스트가 게임 속 플레이어 중 한명으로 같이 게임을 플레이 하는 것. - 어몽어스,덕몽어스 등등
    1. 데드케이트 서버 : 서버 컴퓨터가 플레이어 중에 한명으로 참가하는 것이 아닌, 컴퓨터의 모든 자원을 게임 서버로 떠 받치는데에 사용하기 때문에 서버에 네트워크 품질이 좋아진다.

⭐ 1. 서버 그 자체도 Host로써 플레이 하는 방식

    1. 3명의 플레이어가 존재하는 멀티 플레이 게임이 있다고 가정하자. 컴퓨터 3대이므로 게임세상도 3개. 각 게임 세상에는 3명의 플레이어(본인 포함)가 존재한다.
    1. 호스트가 만약 C라고 가정해보자. 호스트이자 서버인 C의 역할은 A,B,C들이 모여 놀 수 있는 로비(방)을 마련하고, A-B-C 사이에 동기화를 관리한다. 즉, 방장의 역할
  • 요즘 게임들은 서버 부담을 좀 덜기 위해서, 플레이어들 중에 한명을 호스트이자 서버로 지정해서, 다른 플레이어들이 거기에 참가하도록 한다.

👉 Local Player - Remote Player : A 기준.

  • LocalPlayer가 RemotePlayer를 동기화 해야 한다. 즉, A 게임 세상 속 A가 B,C 게임 세상속에 있는 A(분신)에 동기화를 해야한다.

👉 이 방식에 대한 단점 : 플레이어들의 행동을 그대로 믿어버리기 때문에 해커가 핵을 쓰면 그게 그대로 다른 게임 상에 적용을 한다.

  • A가 만약 핵이나 버그를 사용하는 유저라고 가정했을 때 B,C 게임 세상에서의 A(분신) 모두 핵이나 버그를 사용하는 것으로 보인다.
  • 모든 네트워크 기반 게임들은 절대 클라이언트(플레이어)들을 믿지 않는다.
  • 이러한 문제를 막기 위해서 클라이언트들은 중요하지 않는 처리를 맡고, 만약 중요한 처리를 맡게 되면 하는 척만 하고 호스트 혹은 서버에게 대신 처리하도록 요청한다.

👉 이러한 문제를 막기 위해서 클라이언트들은 중요하지 않는 처리를 맡고, 만약 중요한 처리를 맡게 되면 하는 척만 하고 호스트 혹은 서버에게 대신 처리하도록 요청한다.

  • LocalPlayer A가 Remote Player A에게 동기화를 적용시키는 것으로 하였지만, 호스트 혹은 서버에게 대신 처리하도록 요청해야 한다.
  • 위 사진 처럼 클라이언트가 모두 처리하는 것이 아닌 , 클라이언트가 하려는 처리를 하는 척만하고 호스트 혹은 서버에게 방장인 C 에서 이루어진다.
  • 만약, A가 B 에게 총을 쐈다고 가정했을 때 실제로 A는 클라이언트 이기 때문에 총알을 발사하려는 직전까지만 하고 총알을 실제로 만들어서 발사하지 않는다.
  • 여기서, A가 총을 발사하기 전에 방장인 C에게 대신 발사 해달라고 부탁을 한다.
  • 최종적으로, 호스트이자 서버인 방장 게임 세상에서, a가 총을 B에게 발사한다. c에서 b플레이어가 총알을 맞았을 때 물리처리와 충돌처리가 일어나지만, A에서는 일어나지 않는다.
  • C 게임세상 에서 충돌처리와 물리처리에 대한 정보를 A,B 게임 세상에게 전달한다. 즉, 동기화를 C에서 거는 것이고, B가 총알을 맞았다는 것을 다른 게임 세상 속 B에게 동기화를 건다.

👉 즉, 중요한 처리를 방장(서버 혹은 호스트)가 대리 한 다음에 결과물을 다른 클라이언트(A,B,D)에게 뿌린다.

👉 정리

    1. A 게임 세상 A 플레이어가 기존 10M 점프가 아닌 핵을 써서 100M 점프를 하려고 한다. -> 호스트 혹은 서버에게 이 정보를 전달
    1. 하지만 C 게임 세상 A 플레이어가 핵이나 버그를 사용하지 않아서 100M 점프가 아닌 기존 10M 점프를 하고 이 정보를 다른 클라이언트 (B,C,D)에게 전달하면 A 게임 세상 A 플레이어가 100M점프가 씹히고 10M점프를 하게 된다.

👉 즉, 클라이언트를 믿지 않고 호스트 혹은 서버가 대신 처리하게 되면 다른 클라이언트가 불가능한 동작 또는 핵을 실행해도 호스트 혹은 서버쪽에서 그게 먹히지 않는다.

⭐ 배틀필드 게임에서 NetCode의 문제가 초반에 심했었다. 내눈에는 분명 상대방을 총알을 쏴서 맞췄는데 서버측에서는 총알을 맞췄다고 처리를 안해가주고 데미지가 전혀 안들어갔었다.

  • 아무리 우리가 빛의 속도로 통신을 해도 통신간 지연시간이 생길 수 밖에 없다.
    1. 만약 a(로컬플레이어)가 b를 총알로 맞췄다면 ,플레이어 눈에서는 b가 총알을 맞았다고 보일 것이다.
    1. 하지만, 서버 입장에서 플레이어가 총알을 쏘는 척을 하고, 서버에서 총알을 쏘는 것이다. 즉, 플레이어에서는 총알이 없고 서버에서 총알이 있다.
    1. 그래서 서버에 존재하는 A가 B에게 총알을 쐈는데 B가 총알을 맞지 않았다. 그럼 그걸 다시 모든 클라이언트들에게 전파를 해야 한다.
    1. A 클라이언트 입장에서 B 클라이언트를 향해 총을 쏴서 맞췄는데 데미지가 전혀 안 들어간다. 이유는 서버에서 일어나지 않은 일은 처음부터 없던 것이다.

👉 즉, 서버에서 일어난 일 = 클라이언트들에서 일어난 일이라고 생각하면 된다.

  • 배틀필드4에서 1초의 10번정도 데이터를 교환한다고 가정해보자. 즉, 패킷을 1초에 10번 보내고 받으면서 클라이언트 - 서버 사이에 정보를 맞춘다. 1초에 10번 정보가 동기화 된다. 1초에 10개의 패킷 교환
  • 그런데, 연사력이 높은 무기가 1초에 100발을 발사한다고 가정해보자. 단, 데미지는 적다. 아래 는 0.0초~1.0초에 담긴 패킷이다.
  • 근데 1초에 100발이면, 0.1초에 10발이 날라간다. 아래 사진처럼 10번 쪼개져서 정보가 동기화 되어 서버에게 보낸다.
  • 만약에 단 하나의 패킷이 날라가면 10발이 통채로 없어진다.
  • 결론: 플레이어가 아무리 연사력 높은 무기를 잘 쏴서 맞춰도 3번의 패킷이 날라가면 30발(10x3)이 날라가므로, 서버 입장에서 30발을 발사 했다는 사실이 없다. 서버에서 연사력이 높은 무기가 1초에 70발 발사한다고 생각하는 것이다. 서버에서 일어난 일은 클라이언트들에게 모두 뿌리므로 클라이언트 입장에서 버그라고 생각한다.


  • 그럼 만약 1초에 2발을 발사하는 무기가 있다고 가정해보자. 0.1초에 0.2발이 발사된다. 패킷은 1초에 10패킷 교환한다고 가정했을 때 0.1초에 1패킷 교환한다. 즉, 1패킷 교환 할 때 0.2발이 발사되서 패킷 손실이 되어도 게임 플레이에 미치는 영향이 적다.

⭐ 모든 처리를 서버가 클라이언트들에게 싹 다 동기화 할까?

  • 아니다. 그렇지 않다. 싹 다 동기화 하게 되면 네트워크 비용이 비싸진다.

  • 네트워크가 빠르게 패킷을 주고 받을 때, 중요한 패킷만 주고 받으면 되지. 굳이 애니메이션 같은 패킷을 주고 받을 필요가 없다.

  • 투컴을 돌려보면 알텐데, 컴퓨터 2대를 돌렸을 때 a플레이어가 우측으로 갈 때와 b플레이어가 우측으로 갈 때의 애니메이션이 완벽히 싱크가 되지 않는다.

  • 무슨말이냐면, A 게임 세상 A플레이어가 우측으로 갔을 때 다른 게임 세상에 있는 A 플레이어(분신)이 우측으로 갈 수 있게 동기화가 되어야 한다. 단, 그 시점에서 A플레이어가 각자의 게임 세상에서 어떤 애니메이션을 재생시킬지 동기화 하지 않는다. 그 이유는 별로 중요하지 않기 때문이다.

  • 다만, 각 A플레이어는 이동 하는 애니메이션이 재생되게 하게 하지만, 그 때 애니메이션의 관절의 위치 하나하나가 전부 똑같진 않다. 컴퓨터마다 살짝 다르게 보여도 무방하기 때문.

  • 결론: A플레이어가 이동한다는 사실 그 자체는 동기화 하는데 A플레이어의 그래픽이나 애니메이션 하나하나까지 동기화하진 않는다. 애니메이션은 각 클라이언트에서 알아서 처리 하도록 함.


총을 쏘고 점수를 갱신하고 데미지를 계산하는 그러한 중요한 처리는 절대 클라이언트가 처리하지 않고, 서버 혹은 호스트가 무조건 처리한다.

  • 위 과정으로 했을 때, 클라이언트가 어떤 처리를 하는 척 하면서 호스트 혹은 서버에게 어떤 처리를 할 수 있도록 요청한다.
  • A 게임 세상 속 A가 C에게 총알을 발사하려고 하는 정보를 C 게임 세상(호스트 혹은 서버)에게 보낸다.
  • 그리고, C 게임 세상 속 A가 C에게 총알을 발사하게 되는데 , 발사할 때 총알을 맞든 안 맞든 결과를 모든 클라이언트에게 뿌린다.


  • 순서도. 1. 클라이언트가 행동을 하는 척만 함. 하는 척에 대한 정보를 호스트 또는 서버에게 넘김. 2. 호스트 또는 서버가 하는 척에 대한 정보를 하고나서 결과를 클라이언트에게 뿌림.
  • 서버 혹은 호스트에서 동기화가 이루어지기 때문에 , C 게임 세상에서 C가 움직이면 모든 클라이언트에게 뿌리게 되서 다른 게임 세상 속에 있는 C 플레이어(분신)이 움직인다.

⭐ 데드케이트 서버 방식

  • C가 서버일 때 C 플레이어가 존재하지 않고, 모든 자원을 관리하고 게임을 작동하는데 쓰인다.
  • 또한, 제일 중요한 점은 A 게임 세상에서 A가 B를 향해 총알을 발사할 때 실제로 총알을 발사하는 것이 아니라, 실제로는 A가 C에게 요청해서 C 게임 세상에서 A가 B를 향해 총알을 발사하게 된다. 그 후 결과를 A,B 클라이언트에게 뿌린다.
  • 클라이언트가 호스트 및 서버로부터 정보를 받게 되면, 그 즉시 B가 A로부터 총알을 맞게 되는 것이다!

👉 이 방식은 비싼 컴퓨터를 하나 사서 서버용 컴퓨터로 사용해서 서버용이므로 플레이어가 존재하지 않는 방식이다. => 네트워크 품질이 좋다

0개의 댓글