서버와 클라이언트 역할
소개
결정론적 시스템에서 게임 클라이언트는 모든 클라이언트에서 로컬로 실행되는 시뮬레이션과 플레이어 입력만 교환합니다.
과거에는, 모든 게임 클라이언트가 시뮬레이션의 각 체크리스트/프레임을 업데이트하기 전에 다른 모든 플레이어의 입력을 기다리는 락 스텝 접근법이 필요했습니다. Quantum의 고급 예측 롤백 시스템은 이것을 과거의 것으로 만들고 실시간 결정적 시뮬레이션을 가능하게 합니다.
Quantum에서는 예측 시스템을 통해 게임 클라이언트가 입력 예측을 사용하여 로컬에서 시뮬레이션을 진행할 수 있으며, 롤백 시스템은 로컬 게임 상태를 복원하고 잘못된 예측을 다시 시뮬레이션합니다.
게임에 구애받지 않는 권위 있는 서버 구성요소(포톤 서버 플러그인)는 입력 지연 시간과 클럭 동기화를 관리하므로 클라이언트는 가장 느린 서버 컴포넌트가 시뮬레이션을 롤백/확인할 때까지 기다릴 필요가 없습니다.
서버
Quantum은 서버 기반 솔루션입니다. Quantum 서버 플러그인은 완전히 게임에 구애받지 않는 바닐라 버전과 사용자 지정 버전의 두 가지가 있습니다. 전자는 퍼블릭 클라우드에서 실행되는 모든 게임에 동일하며, 후자는 전용 photon enterprise 클러스터에 구축할 수 있습니다.
현재 게임 세션의 configuration 은 photon 룸을 만든 클라이언트가 서버로 보낸 DeterminsticConfig
에 의해 정의됩니다. 여기에는 서버가 해당 세션을 관리하기 위해 사용할 입력 허용에 대한 업데이트 속도 및 하드 허용 오차 등의 정보가 포함됩니다.
기본값
모든 Quantum App ID 용 기본 플러그인은 필요한 모든 작업을 수행하고 클라이언트 입력을 동기화하며 클라이언트가 로컬에서 결정론적 시뮬레이션을 실행하도록 보장합니다. 여기에는 다음이 포함됩니다.
- 입력 관리 (시간과 검증)
- 클럭 동기화
- 플레이어 인덱스 할당
특히 입력 관리는 입력 확인 스트림이 모든 클라이언트에 이상 없이 안정적으로 전달되도록 하여 과도한 롤백이 발생하지 않도록 하는 데 중요합니다.
입력과 프레임 검증
자주 묻는 질문은 다음과 같습니다. 누가 검증된 프레임을 서명/인증합니까? .
답은 다음과 같습니다. 기술적으로 아무도 프레임을 검증하지 않습니다. 그것보다는 다음 2가지 기준을 충족하는 프레임입니다:
- 프레임/체크 N에 대한 모든 검증된 입력이 서버에서 수신되었습니다.
- 이전의 모든 프레임/틱 N-1은 각각의 검증된 입력을 사용하여 시뮬레이션되었습니다.
두 조건이 모두 충족되면 프레임이 검증 된 것입니다. 프레임의 상태를 확인하는 방법에 대한 자세한 내용은 설명서의 Frame 문서를 참조하십시오.
서버는 수락된 입력의 공식 스트림에 "서명" 하고 검증된 입력을 세션 내 클라이언트에 전달합니다.
입력은 로컬 시뮬레이션을 진행하는 데 중추적이므로 검증된 특정 체크 표시/프레임과 관련된 입력은 모든 클라이언트가 로컬에서 결정론적 검증된 프레임을 시뮬레이션하기에 충분합니다.
사용자 지정 플러그인
전용 서버(Photon Enterprise)를 통해 기본을 뛰어넘을 수 있습니다. Quantum 사용자 지정 플러그인을 사용하면 입력 가로채기, 구성 데이터 등에 대한 사용자 지정 컨트롤을 추가하여 서버에서 세션 관리를 사용자 지정할 수 있습니다.
노트: 사용자 지정 플러그인을 개발하고 배포하는 데 게임 플레이/클라이언트 코드를 변경할 필요가 없습니다. 이 단계는 코어 게임이 완료된 후 점진적으로 수행할 수 있는 옵션 단계입니다.
권한
게임 권한을 유지하려는 경우 사용자 지정 플러그인을 사용하여 다음 중 하나를 수행할 수 있습니다.
서버에서 백엔드로 전체 입력 스트림을 푸시 합니다.
게임을 끝낸 모든 클라이언트의 게임 매치 결과를 확인합니다.
- 모두 매치된 경우, 현재와 같은 결과를 수용합니다.
- 매치가 되지 않은 사항이 있는 경우, 일시적으로 다수결(즉, 대부분의 클라이언트가 보낸 결과)을 수락하고 사후 사실 확인으로 일치 여부를 표시하십시오.
자동 사후 검증. Quantum의 콘솔 러너를 사용하여 저장된 재생을 실행합니다. 이것은 유니티가 필요하지 않으며 몇 초 내에 전체 일치를 시뮬레이션할 수 있습니다.
노트: 위에서 언급한 어떤 측면도 서버 측 시뮬레이션이 필요하지 않습니다.
서버 측 시뮬레이션과 치팅
서버에서 전체 시뮬레이션을 실행할 수 있으며, 장벽은 없습니다. 그러나 실제적이고 비용적인 관점에서 보면 확인은 필요합니다.
보통 이 질문은 부정행위를 막기 위한 노력으로 생겨납니다. 운용 문제가 되더라도 아무 문제 없습니다.
게임이 결정적이기 때문에, 보통 이해되는 의미에서 부정행위를 할 수 있는 방법은 없습니다. 일치 결과를 확인하거나 불만 사항에 응답하는 경우 서버에서 이미 검증된 공식 입력 스트림을 사용하여 이전 섹션 참조 끝에 일치 결과를 완전히 확인할 수 있습니다. 이 작업은 서버의 Sim 마스터 복사본을 실행하지 않고도 수행할 수 있습니다.
클라이언트
로컬 클라이언트는 게임을 실행합니다(Quantum + 유니티 내의 뷰). 그 역할은 다음과 같습니다:
- 제때에 서버에 입력을 보냅니다. 입력이 제시간에 서버에 도달하지 못하면 입력이 교체됩니다.
- 동기화된 시계를 기준으로 프레임을 예측합니다.
- 서버로부터 연속적인 입력 확인 스트림을 수신하고, (필요한 경우) 롤백하고, 프레임을 확인합니다. 프로세스에 대한 개요는 입력 및 프레임 확인의 이전 섹션을 참조하십시오.
검증된 프레임의 로컬 시뮬레이션은 고정된 업데이트 속도로 실행됩니다. 예측된 프레임의 양은 다양하며 시뮬레이션에서 로컬 세션에 충분한 델타 시간이 누적되는 즉시 예측이 계속됩니다.
롤백을 자주 한다고 가정하면, 예측된 프레임에 대해 실제로 30Hz 시뮬레이션 속도를 300Hz로 실행할 수 있습니다. 이 값은 매우 높게 보일 수 있지만, 단순히 1개의 확인된 프레임 당 1개의 롤백 + 10개의 예측된 프레임으로 변환됩니다. 예측된 프레임은 시뮬레이션되었다가 롤백 된 후 다시 시뮬레이션됩니다.
유니티 뷰에 대한 업데이트 속도는 시뮬레이션 속도와 독립적입니다. 예를 단순화하기 위해 30Hz 유니티 업데이트를 가정하겠습니다. 이는 각 유니티 업데이트를 의미합니다.
- 1개의 확인 체크 표시(1개의 완전히 무거운 프레임 시뮬레이션 + 동기화된 이벤트가 전송됨) 및,
- 예측된 모든 틱을 롤백하고 동기화 클럭까지(RTT/2에 비례) 다시 시뮬레이션합니다.
예측 롤백 시스템이 높은 ping에서도 원활하게 작동하도록 하려면 예측된 틱이 위에서 언급한 속도로 실행될 수 있을 만큼 "경량" 인지 확인해야 합니다. 부하를 줄이는 한 가지 방법은 카메라 주변의 엔티티를 예측하는 데 도움이 되는 예측 컬링을 사용하는 것입니다.
입력, Ping과 지연
서버는 DeterministicConfig
의 HardTolerance
를 입력을 수신하는 시간제한으로 사용합니다. 서버가 정의된 시간 내에 입력을 수신하지 못할 경우 클라이언트의 입력을 대체합니다.
클라이언트 로컬 롤백의 최대 길이는 hard-tolerance + RTT/2 + jitter
입니다. 서버는 모든 클라이언트에 대해 이 제한을 적용합니다. 이는 플레이어의 경험의 품질을 자신 의 네트워크 품질과 연결되기 때문에 플레이어의 수에 관계없이 일관된 경험을 보장합니다. 다시 말해, 한 클라이언트가 연결 상태가 불량할 경우 자신의 경험만 영향을 받고 다른 모든 사람의 경험은 원활하게 유지됩니다.
게임 세션에 참여하는 플레이어가 많을수록 둘 중 하나 이상이 네트워크에 문제가 있을 가능성이 커짐에 따라 게임 세션의 중요성은 더욱 커집니다.
TL;DR:
다음은 Quantum 게임의 기본 구성 요소입니다:
클라이언트:
- 게임 클라이언트 시뮬레이터: Quantum 서버와 통신하고 로컬 시뮬레이션을 실행하며 모든 입력 예측과 롤백을 수행합니다.
- 사용자 지정 게임 코드: 클라이언트가 Quantum ECS를 사용하여 순수 C# 시뮬레이션(유니티에서 분리)으로 개발했습니다.
Quantum의 API는 고성능 코드를 구성하는 프레임워크 외에도 결정론적 3D 벡터 연산, 2D 및 3D 물리 엔진, navmesh Pathfinder 등 모든 게임에서 재사용할 수 있는 다양한 사전 구축된 구성 요소(데이터)와 시스템(로직)을 제공합니다.
서버:
- Quantum 서버 플러그인 : 게임 클라이언트 간의 입력 타이밍과 전달을 관리하며 클럭 동기화 소스 역할을 합니다.
- Quantum 사용자 지정 플러그인: 서버 플러그인을 확장하여 클라이언트 호스팅 백엔드 시스템(매치메이킹, 플레이어 서비스 등)과 통합할 수 있습니다.
예측 vs 검증된 프레임:
predicted
: 클라이언트는 로컬 클라이언트가 예측한 입력을 기반으로 모든 프레임률에서 CPU 라이트 "예측" 프레임을 시뮬레이션합니다.verified
: 클라이언트는 서버 검증 입력 스트림이 수신될 때 결정된 프레임률로 CPU 집약적인 "검증" 프레임을 시뮬레이션합니다. 잘못된 예측은 롤백되었다가 다시 예측됩니다.