커맨드

커맨드는 서버 권한으로 클라이언트 예측을 지원하기 위한 Bolt 내의 선택적 구성입니다.

예측

로컬 엔티티(일반적으로 플레이어)는 항상 예측됩니다. 로컬 엔티티는 커맨드 시스템을 사용하여 로컬 컴퓨터로 즉시 이동합니다. 플레이어는 즉각적인 대응이 중요합니다. 플레이어의 입력은 커맨드의 일부로 서버로 전송됩니다. 서버는 이러한 입력도 플레이하여 클라이언트가 이미 예측한 것과 동일한 시뮬레이션을 수행합니다. 그런 다음 서버는 특정 프레임에 대한 결과(최종 위치, 속도 등)를 플레이어에게 반환합니다. 그런 다음 해당 프레임에 있는 서버에 자신의 위치 및 기타 상태를 다시 설정합니다(커맨드 결과의 “보정”). 그리고 그 시점부터 현재까지의 입력 내용을 다시 반복해서 자신이 예측한 곳으로 돌아오길 바라요.

Back To Top

권한부여

서버의 시뮬레이션이 다를 경우 플레이어는 다른 위치에 있게 됩니다. 시뮬레이션이 서버에서 권한 있게 실행되고 있습니다. 플레이어는 시뮬레이션이 어떻게 될지 예측하려고 합니다. 플레이어가 속도를 매우 빠른 속도로 설정하면 클라이언트 시뮬레이션이 서버에 전혀 영향을 미치지 않기 때문에 서버는 상관하지 않습니다.

Back To Top

커맨드의 동작 방식은?

SimulateController()는 게임에서 입력을 수집하여 커맨드에 넣을 때 사용합니다. SimulateController는 프레임당 한 번 실행됩니다.

ExecuteCommand() 는 엔티티의 소유자 및 컨트롤러에서 모두 실행되므로 서버가 생성한 다음 클라이언트에 제어 권한을 부여하는 플레이어 캐릭터가 있는 경우, ExecuteCommand는 서버와 제어 클라이언트에서 모두 실행됩니다. 다른 클라이언트에서는 실행되지 않습니다.

entity.QueueInput(cmd);이라고 부르는 커맨드는 클라이언트에서 로컬 실행을 위해 예약되어 있으며 원격 실행을 위해 서버로 전송됩니다. Bolt는 이를 통해 클라이언트 측 예측을 수행할 수 있습니다. 이 명령은 서버와 클라이언트에서 모두 실행됩니다.

서버가 커맨드를 실행하면 커맨드를 생성한 클라이언트에 커맨드의 상태를 다시 보내고 클라이언트에서 해당 커맨드의 상태를 자체적인 올바른 상태로 재정의합니다.

resetState 파라미터는 resetState가 true일 때 전달된 커맨드의 상태로 캐릭터 모터의 상태를 재설정하라는 메시지를 표시합니다. 이 문제는 원격 제어 클라이언트에서만 발생하며, 서버에서는 발생하지 않습니다. 이 문제는 모든 프레임의 시작 부분에서 한 번 발생하며, 전달되는 명령은 서버로부터 올바른 상태를 수신한 명령입니다.

resetState 명령을 실행한 후 Bolt는 리셋 프레임 프레임에서 현재 프레임까지 클라이언트에서 다른 모든 명령을 다시 실행하여 현재 상태로 “캐치업” 합니다. 모든 프레임(이것이 시뮬레이션 속도)이 됩니다.

일반적인 질문: 클라이언트에 대한 리셋 상태 논리를 설명하면 플레이어가 매우 빠르게 움직이는 이유는 무엇입니까?
그 이유는 모든 체크 표시를 할 때마다 Bolt가 특정 프레임(재설정 상태)에 있는 위치로 되감긴 다음 해당 프레임에서 현재 프레임으로 대기 중인 모든 명령을 재생하기 때문입니다. 대부분의 시나리오에서는 체크 표시 이전과 동일한 위치로 돌아가지만 새 체크 표시의 추가 입력을 사용하여 다시 배치해야 합니다. 재생된 입력은 일반적으로 동일한 네트워크의 서버에서 재생되는 경우에도 10개 이상의 명령입니다. 리셋 상태 논리를 설명하면 먼저 위치를 다시 설정하지 않고 Bolt가 10개 이상의 커맨드(앞으로 누를 경우 전진 입력)을 실행하게 됩니다. 따라서 체크 표시당 10개 이상의 “앞으로 이동”을 실행하게 됩니다! 이것이 그렇게 빨리 움직이는 이유입니다. 이는 완전히 클라이언트 쪽이며 서버는 이러한 빠른 이동을 반영하지 않습니다. 기본적으로 서버를 완전히 무시하는 것입니다.

Back To Top

개요

Command editor

Back To Top

속성

  • Is Instant - 이 커맨드의 대기열에 있는 모든 입력은 서버에 도달하면 즉시 다음 프레임에서 실행됩니다.
  • Enable Frame Limit - SimulateController()당 한 개의 입력만 큐에 입력되는 것으로 제한됩니다. 속도-해킹을 막을 수 있습니다.
  • Correction Interpolation - 서버에서 수신한 결과의 보간.
  • Enable Delta Compression - 약간 향상된 처리 시간의 가격에 대한 네트워크 트래픽 및 할당을 줄이기 위한 것입니다. 항상 결과를 측정합니다! 입력/결과에 대해서는 델타 압축이 되지 않으므로 부울만 사용하여 사용해서는 안 됩니다.

기술문서 TOP으로 돌아가기