저는 현재 (빠른 클라이언트 - 서버 응용 프로그램의 예로 "간단한 멀티 플레이어 게임"할당의 일부로) 간단한 빠른 진행을위한 멀티 플레이어 게임 서버를 작성하려고합니다 몇 선수를위한 게임 (20 이하 나는 생각한다). 나는 보장 된 전달 (즉, 채팅 메시지, 로그인 및 로그 아웃 요청, ping 패킷 등)을 필요로하는 패킷에 대해 TCP 소켓을 사용하고있어 마지막 패킷 만 전달 된 이후로 반드시 전달할 필요는없는 모든 것에 대해 UDP를 사용합니다. 중요 (즉, 사용자 입력, 게임 세계 및 객체 업데이트 등).멀티 플레이어 게임 서버 모델 - 세계 복제 및 개체 업데이트
내 게임 세계가 어떻게 생겼는지 여기에 언급해야합니다. 모든 객체 서버 측에는 해당 ID, 역할 및 소유자 구성원이 있습니다. Id는 기본적으로 클라이언트를위한 식별자이므로 개체 업데이트를 보내면 어떤 개체를 업데이트할지 알 수 있습니다. 소유자는 객체 소유자에 대한 정보입니다. 즉, 액터를 제어하는 플레이어입니다. 플레이어가 연결/로그 아웃을 잃으면 고아 오브젝트를 제거하기 위해이 도구를 사용합니다. 그러나 대부분의 객체는이 값을 Server로 설정합니다. 마지막으로 역할은 객체가 클라이언트에게 중요한지 여부를 결정합니다. 이 값은 서버 측 게임 상태 계산에만 사용되므로 클라이언트에 복제 할 필요가없는 객체 인 경우 RelevantToOwner로 설정할 수 있습니다 (이 객체는 소유자에게만 복제됩니다. 즉, 플레이어 개인 인벤토리는 모든 사람에게 복제해야 함), RelevantToList (개체가 목록의 모든 플레이어에게 복제됩니다. 즉, 개체를 볼 수있는 플레이어 목록이 있고 해당 개체에만 복제됩니다.) RelevantToAll (모든 사람에게 복제)입니다.
사용자가 로그인 패킷을 보낼 때 사용 가능한 슬롯이 있는지 여부를 확인한 다음 그에게 세계를 복제합니다 (현재 세계 상태 - 역할이 ServerSide 또는 RelevantToList로 설정된 모든 개체를 보내십시오 - 물론 클라이언트가 아니면 해당 개체의 목록에 있음).
그런 다음 서버 게임 상태 업데이트 루프가 반복 될 때마다 나는 똑같은 것을 전 세계 국가에 보냅니다.
사용자가 로그 아웃 패킷을 보낼 때 로그인 한 클라이언트에서 그를 삭제하고 빈 슬롯을 제거하고 게임 세계 (이 사용자가 소유자 인 개체)에서 모든 고아 개체를 제거합니다.
- 이 모델은 실시간 멀티 플레이어 게임에 적합한 아니면 내가 끔찍하게 잘못하고 있어요 :
여기 내 질문은?
- 초기 세계 복제 후에 패킷 양을 줄이는 방법이 있습니까 (예 : 마지막 반복 이후 상태가 변경된 개체 만 업데이트). 생각해 보았으며 지금까지 한 가지 큰 문제가 발생했습니다. 이 방법을 사용하면 이전 반복의 UDP 패킷이 손실되고 이후 반복에서 개체 상태가 변경되지 않으면 개체가 플레이어 측에서 업데이트되지 않습니다.
- 어떻게 여러 개체 업데이트를 하나의 패킷으로 묶을 수 있습니까? (현재 하나의 객체/패킷을 비효율적이고 또한 매우 끔찍하게 보내고 있습니다.)
- 클라이언트/서버 게임의 일부 작동 예제 (소스는 좋을 것 같습니다)를 가리킬 수 있습니까? ionals는 그것을합니까? C++ 또는 C는 좋지만 Java/C#/Python도 좋습니다.
btw이게 과제물이라면 숙제 태그를 추가해야합니다. – BugFinder