현대의 멀티 플레이어 게임에서 환경과 같은 거대하고 정적 인 객체가 서버에서 클라이언트로 전송됩니까?


18

나는 플레이어가 경기에 참가할 때 이미 생성 된 모든 객체를 가져 오는 권위있는 시스템을 가지고 있습니다 (클라이언트).

다음과 같이 보입니다 :

  1. Client 액세스 토큰을 Server
  2. Client 로부터 수락을 받는다 Server
  3. Client 장면을 게임 장면으로 전환
  4. Server플레이어, 상자, 상호 작용할 수있는 오브젝트를 보내서 client스폰하고 표시 할 수 있습니다.

그러나 지상 물체는 어떻습니까? 지금은 서버와 클라이언트에서 바닥과 같은 하나의 정적 평면을 사용하는 것과 동일한 장면이 있습니다. 현재 새로운 물건, 나무, 계단을 추가하고 함께 물건을 짓고 있습니다.

나는 생각했다 – 우리는 좋다. 그러나 환경도 동기화되어서는 안됩니까? 어떻게 든 네트워크에 연결되어 있습니까? 서버가 소유하고 있습니까?

보자 League of Legends:

여기에 이미지 설명을 입력하십시오

정적 환경, 아마도 하나의 결합 된 메쉬 (계단, 잔디, 벽, 상점)입니다. 그러나 실제로 클라이언트에 보관되어 있습니까 아니면 로딩 화면 중에 서버가 전송합니까?


1
리그 캐릭터와 환경에 사용자 정의 스킨을 추가 할 수 있다는 점에서 생각할 수도 있습니다. 서버로 보내지 않으면 로컬로 표시되므로 로컬로 저장되고 렌더링된다는 결론에 도달하는 것이 좋습니다. 또한 충돌은 게임 플레이에 영향을 미치지 않습니다.
Candid Moon _Max_

답변:


41

대부분의 경우, 어떤 종류의 예술 자산도 네트워크를 통해 일상적으로 전송되지 않습니다. 일반적으로 모든 클라이언트는 로컬로 동일한 컨텐츠 자산을 갖습니다. 콘텐츠 체크섬 또는 이와 유사한 방식으로 이러한 경우를 보장하는 코드가있을 수 있습니다. 사용자가 클라이언트 측의 일부 컨텐츠를 변경하는 것에 대해 걱정이되는 경우 유사한 시스템을 구현할 수 있습니다.

서버는 특정 자산을 표시하거나 숨겨야한다는 지시문을 클라이언트에 보낼 수 있지만 실제 자산 데이터는 보내지 않습니다. 실제로 이것은 너무 낭비적이고 느리고 데이터가 제한적인 사람들에게 실제 문제를 일으킬 수 있습니다.

어떤 경우에는 자산이 "스포일러"등으로 간주되는 경우 더 작은 자산이 전체에 걸쳐 스트리밍 될 수 있습니다. 그러나 드문 일입니다. 일반적으로 당신이 볼 것은 게임을 다운로드 할 수도 있습니다 새로운 패치, 또는 어떤 컨텐츠를, 그러나 그것은 단지 시작시 패치 과정에서, 한 번 발생합니다. 게임 플레이 중에는 아닙니다.


21
이 답변은 정적 자산 만 다룹니다. 동적 / 플레이어 생성 자산 (예 : Minecraft 월드 청크 또는 플레이어가 업로드 할 수있는 MMORPG 길드 로고)이 전송되어야합니다. 그러나 그때조차도 일반적으로 필요한 데이터 양을 최소화하려고 시도합니다 (Minecraft 예 : 전체 덩어리 대신 블록 업데이트 보내기, 변경된 블록 유형 / 상태 및 좌표 만 나타냄) 및 클라이언트 측에서 데이터 캐시 .
hoffmale

@hoffmale 예, 좋은 지적입니다. 질문은 풍경이 끝날 때 정적이라고 언급했기 때문에 그 점을 높이려고 생각하지 않았지만 좋은 것입니다.

3
자산이 스포일러 인 경우 일반적으로 자산이 클라이언트에 있고 암호화되어 있으며 자산이 필요할 때 해독 키가 서버에서 클라이언트로 전송됩니다.
그랜트 데이비스

4
예를 들어, 트리의 좌표를 클라이언트로 전송하는 대신 트리를 무작위로 맵에 배치해야하는 경우 클라이언트는 임의의 숫자 생성기의 시드를 클라이언트로 보냅니다.
그랜트 데이비스

5

게임 종류를 포함한 여러 가지 요인에 따라 다릅니다 (여기서는 RTS라고 가정하지만 오픈 월드 MMO도 염두에 두어야합니다). 기본 로컬 대 플레이어 지형 상태는 연결시 전송되거나 클라이언트 자산의 일부입니다. 맵이 클라이언트와 함께 제공되거나 게임을 시작하기 전에 다운로드되는 RTS 게임을 생각해보십시오.

실제로 메쉬는 대부분의 RTS 사례에서 이미 클라이언트에 있기 때문에 일반적으로 전송되지 않습니다. 동기화 맵을 유지하는 데 가장 중요한 충돌 맵 이 전송 되는지 여부 는 또 다른 질문입니다. 그러나 대부분의 RTS에서 이는 다시 클라이언트에 사전 저장됩니다.

따라서 실제로 모든 것은 RTS와 함께 제공되는 것, 재생 시간 전에 맵을 다운로드하는지 또는 게임이 시작되는 시점에 따라 달라집니다.

그 후에 동기화 상태를 유지하는 몇 가지 일반적인 방법이 있습니다.

  • 델타는 클라이언트에게 전송됩니다. 서버와 함께 로컬 / 클라이언트 세계를 최신 상태로 유지하는 가장 일반적이고 효율적인 방법입니다.
  • 체크섬은 때때로 월드 상태가 실제로 일치하도록 서버에서 클라이언트로 또는 클라이언트에서 서버로 전송됩니다.
  • 때때로 부동 소수점 드리프트와 같은 기술적 문제로 인해 클라이언트를 재 동기화하기 위해 전체 상태가 재전송됩니다.

4

귀하의 정확한 질문에 관해서는 리그 오브 레전드가 구체적으로 어떻게 처리하는지 모르겠습니다. 나는 그 게임을 한 번도 해본 적이 없으므로 필요한지 여부를 제안 할 수 없습니다.

그러나 귀하의 질문에 대한 답변은 일반적으로 매우 간단하고 간단합니다.

데이터가 정적경우 데이터가 변경 되지 않는다는 것을 확실히 알고 있다면 (정기적 인 전체 게임 업데이트가 부족하지만 별개입니다) 왜 추가 데이터를 보내려고합니까? 일반적으로 피할 수있는 것은 보내지 마십시오. 해당 통신이 필요한 경우에만 데이터를 보내십시오 .

반면에 데이터가 시간이 지남에 따라 변경 되거나 해당 옵션을 열어두고 싶다면 실제로 문제가 있습니까? 이 경우 데이터 보내야합니다. 그렇지 않으면 클라이언트에 필요한 것이 없습니다.

이는 지형 데이터뿐만 아니라 모든 네트워크 통신에 적용됩니다. 모든 것 .


2

아니.

나는 리그 오브 레전드의 소스와 챔피언 모델, 상점 주인, 일반지도 배경 및 사실 이후에 추가 된 보풀 생물을 포함한 모든 것을 파는 것에 대한 공정한 일을했습니다 (일부 바위에있는 작은 다람쥐와 달팽이처럼 강)은 클라이언트쪽에 유지됩니다. 클라이언트가 이러한 모든 모델을 가지고 있다는 사실은 LoL이 수 기가 바이트 인 이유 중 하나입니다.

이 모든 데이터를 서버에서 클라이언트로 전송하는 것은 어리석은 일이며, 다음 게임에서 다시 사용하기 위해 대역폭 사용을 씹는 것은 말할 것도 없습니다.

그렇다면 어떻게 해결됩니까? 각 플레이어 는 게임의 다른 플레이어 에게 중요한 데이터 만 서버로 보냅니다. Q 재사용 대기 시간이 5 초 남았는지 또는 딥 테러 트레시 스킨이 거품을 생성하는지 알 필요가 없습니다. 게임 내에서 전달되는 것은 Vel'Koz가 Q를 캐스팅하고 Viktor가 왼쪽으로 이동하는 등입니다.

좀 더 명확하게 말하면 로딩 화면과 관련하여, 발생하는 일에는 중간 패치 패치와 같은 것들이 있으며, 모든 플레이어는 게임이 시작되기 전에 폭동 서버와 대화하고, 안전한 연결 핸드 셰이크 및 부정 행위 방지 프로토콜을 사용해야합니다.

노트:

클라이언트가 가지고있는 것을 살펴보고 서버가 통과하지 못하면 C : \ Riot Games \ RADS \ lol_Game_Client \ Projects 폴더를 찾으십시오. m 지금 메모리에서 작업하고 온라인에서 .RAF 파일 압축 풀기를 찾으십시오. 그러면 화면 스플래쉬 및 스킨 텍스처 로딩, 챔피언 스켈레톤로드와 같이 로컬에있는 모든 항목을 볼 수 있습니다.


1
이를 구현하는 명백한 방법은 클라이언트가 (전용 자산 서버에서) 이미 로컬에 저장하지 않은 자산을 요청하고, 자산을 수령하면 영구적으로 자산을 추가하는 것입니다. 디스크의 로컬 영구 저장소. 그렇게하면 자산이 실제로 필요할 때만 한 번만 다운로드됩니다. (작동 한 후에는 클라이언트의 로컬 상점에 필요한 자산을 미리 채우는 것이 최적화 될 것입니다. 이렇게하면 게임의 설치 프로그램 패키지를 크게 만드는 대신 첫 번째 연결시 게임 시작 시간이 줄어 듭니다)
제레미 프라이스 너

1
@JeremyFriesner 왜 이것이 명백한 방법일까요? 이 게시물에 요약 된 현재 구현보다 나쁘게 들리므로 모든 자산을 미리 설치하여 필요할 때 즉시 사용할 수 있습니다. 단일 플레이어 게임에서는 문제가 없지만, 많은 사람들이 재생 중에 새로운 자산이 다운로드 될 때까지 계속 기다려야하는 것보다 더 긴 설치 시간 (및 더 많은 디스크 공간 사용)을 선호한다고 생각합니다.
Anthony Grist

2
멀티 플레이어 게임? 절대 재앙. 한 사람이 지금까지 필요하지 않은 일부 자산을 다운로드해야하기 때문에 다른 모든 플레이어가 게임을 시작하기를 기다리는 것을 원하지 않습니다.
Anthony Grist

1
@AnthonyGrist 이것이 리그 오브 레전드와 같은 많은 게임이 경기에 참여하기 위해 대기열에 참가하기 전에 모든 게임 자산을 다운로드해야하는 이유입니다. 큰 자산이 작동하기를 기다리는 동안 게임 지연이 발생하는 것보다 훨씬 효과적입니다. 이 게임 장르에서 플레이어는 10ms 이상의 핑 감소를 기대하며 종종 50ms 미만의 핑으로 플레이하고 있으며 이것이 100에서 150 범위로 점프하는지 알 수 있습니다. 게임 도중 자산을 가져 오기 위해 대기하는 것은 MOBA 또는 FPS에서 재앙이 될 수 있으며, 잘못된 시간에 발생한 경우 게임 결과를 변경할 수도 있습니다.
JustWannaFly

@AnthonyGrist (계속) 나는 당신이 이것에 대해 생각할 수 있다고 생각합니다. 일부 멀티 플레이어 / 경쟁 게임에서 플레이어는 클라이언트가 모든 업데이트 및 대기열 입력을 처리하도록하여보다 실시간 게임 플레이 경험을 위해로드 / 패칭 / 설치 시간이 길어집니다. 이를 통해 사전 제작 된 파티에 참여하기를 원하지 않는 한 자산이 필요한 특정 플레이어 만 기다려야합니다. 파티의 모든 플레이어는 상대방을 찾기 위해 대기열에 입장해야합니다.
JustWannaFly

1

이것이 이루어 지지 않은 곳의 예는 Elder Scrolls Online으로, 클라이언트는 지상 고도에 대해 신뢰했습니다 .

금광 부들은 몇 피트 떨어진 땅을 떨어 뜨렸다. 그런 다음 PC에서 보거나 NPC의 공격을받지 않고 지형 아래에서 "자원"을 탐색하고 아래에서 채굴 자원을 찾을 수 있습니다.

비슷한 편집을 통해 절벽을 매끄럽게 걷어 올릴 수 있고 정적 벽에서 제거 또는 라우팅하거나 모든 정적 개체를 볼 수 있습니다.

기본적으로 서버는 플레이어의 위치에 대해 클라이언트를 신뢰했으며 모든 정적 플레이어에 대해 모든 단일 플레이어에 대한 서버 측의 충돌을 계산하는 것은 상당히 무겁습니다.

그러나 Furcadia와 같은 타일 기반 게임에서는 다릅니다. 이동하는 모든 정사각형에는 서버 측 워커빌리티가 있으며 서버는 클라이언트를 아무것도 신뢰할 필요가 없습니다. 서버는 모든 움직임과 사용자 동작을 알고 검증합니다. 클라이언트는 서버가 결과를 말할 때만 작업을 표시합니다.


1
TL; DR : 항상 클라이언트가 거짓말, 속임수, 있다고 가정 느시과 . 그러나 모든 것에 대한 서버 유효성 검사는 용량을 줄입니다.
Draco18s
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.