This document is about: QUANTUM 2
SWITCH TO

프레임

소개

Quantum의 예측 롤백 아키텍처를 통해 지연 시간을 최소화할 수 있습니다. Quantum은 항상 프레임을 롤백하고 다시 시뮬레이션합니다. 이것은 결정론에 필요하며 서버에 의한 플레이어 입력의 검증을 포함합니다. 서버가 플레이어 입력을 확인하거나 덮어쓰거나 대체하면(입력 내용이 제시간에 서버에 도달하지 못한 경우에만 해당), 주어진 프레임에 대한 모든 플레이어의 유효한 입력이 클라이언트로 전송됩니다. 검증된 입력이 수신되면 마지막으로 확인된 프레임은 확인된 입력을 사용하여 진전됩니다.

주의: 플레이어 자신의 입력이 제때 서버에 도달하지 못했거나 유효성을 검사할 수 없는 경우 롤백 됩니다.

프레임의 유형

두 프레임 유형 간의 Quantum 차이는 다음과 같습니다:

  • 검증됨 그리고,
  • 예측됨.

검증됨

검증된 프레임은 신뢰할 수 있는 시뮬레이션 프레임입니다. 검증된 프레임은 모든 클라이언트 시뮬레이션에서 결정적이고 동일함을 보장합니다. 검증된 시뮬레이션은 서버에서 확인된 입력을 수신한 후에만 다음 프레임이 시뮬레이션되므로, 서버에서 RTT/2에 비례하여 앞으로 이동합니다.

프레임은 다음 조건이 모두 참인지 확인합니다:

  • 모든 플레이어의 입력은 이 틱에 대해 서버에 의해 확인됩니다.
  • 이어지는 이전의 모든 틱이 검증됩니다.

서버에서 플레이어의 하위 집합만의 입력만 유효성을 검사한 부분 틱 확인은 검증된 틱/프레임으로 이어지지 않습니다.

예측됨

검증된 프레임과 달리 예측된 프레임은 서버 확인 입력이 필요하지 않습니다. 이는 시뮬레이션이 로컬 세션에서 충분한 델타 시간을 축적하는 즉시 예측 프레임이 진행됨을 의미합니다.

유니티 측 API는 예측된 프레임의 다양한 버전에 대한 접근을 제공합니다. 아래 API 설명을 참조하십시오.

  • Predicted : 동기화된 클럭를 기반으로 한 시뮬레이션 "헤드"입니다.
  • PredictedPrevious (예측 - 1): 메인 클럭 앨리어싱 보간법에 사용됩니다(유니티의 로컬 클럭이 메인 서버 클럭에서 약간 벗어날 수 있으므로 대부분의 뷰는 이를 사용하여 매끄럽게 유지합니다. Quantum은 서버 클럭과 동기화되어 별도의 클럭에서 실행됩니다. 부드럽게 수정됩니다).
  • PreviousUpdatePredicted: 이것은 ("수정된" 데이터가 포함된) 마지막 Session.Update을 호출했을 때 "예측된/헤드"였던 정확한 프레임입니다.

이것은 지난 세션에서 "예측된/머리"였던 바로 그 프레임입니다.업데이트가 호출되었습니다("수정된" 데이터 포함). 오류 수정 보간법에 사용됩니다(대부분 오류가 없습니다). 오류 수정 보간법에 사용됩니다(대부분 오류가 없습니다).

API

검증됨예측됨 프레임의 개념은 API가 약간 다르지만 시뮬레이션과 뷰 모두에 존재합니다.

시뮬레이션

시뮬레이션에서는 Frame 클래스를 통해 현재 시뮬레이션된 프레임의 상태에 접근할 수 있습니다.

메소드 리턴 값 설명
IsVerified bool 프레임이 모든 클라이언트에서 결정적이고 서버에서 확인된 입력을 사용하는 경우 true를 반환합니다.
IsPredicted bool 프레임이 로컬로 예측된 프레임인 경우 true를 반환합니다.

뷰에서 검증된예측된 프레임을 QuantumRunner.Default.Game.Frames를 통해 사용할 수 있습니다.

메소드 설명
Validated 신뢰할 수 있는 시뮬레이션 프레임으로, 모든 클라이언트에서 동일합니다.
Predicted 동기화된 Quantum 클럭을 기반으로 한 로컬 시뮬레이션 "헤드"입니다. 클라이언트마다 다를 수 있습니다.
PredictedPrevious Predicted - 1
메인 클럭 별칭 보간법에 사용되며, 대부분의 뷰는 이를 사용하여 평활하게 유지합니다. 유니티의 로컬 클럭이 메인 서버 클럭에서 약간 벗어날 수 있으므로 Quantum은 서버 클럭과 동기화된 별도의 클럭에서 실행되어 부드럽게 수정됩니다.
PreviousUpdatePredicted 마지막으로 Session.Update가 호출되었을 때 "예측됨/헤드" 프레임이었던 프레임의 다시 시뮬레이션된 버전입니다. 이는 롤백의 경우 보유 데이터를 "수정" 하기 위해 필요합니다. 이것은 보간법의 오류 수정을 위해 보기에 의해 사용됩니다. 이는 안전 조치이며 거의 필요하지 않습니다.

Frame.User 사용

Frame.User.cs에 데이터를 추가하여 Frame을 확장할 수 있습니다. 그러나 그렇게 함으로써 프레임에 사용되는 해당 초기화, 할당 및 직렬화 방법도 구현해야 합니다.

C#

partial void InitUser() // Initialize the Data

partial void SerializeUser(FrameSerializer serializer) // De/Serialize the Data
partial void CopyFromUser(Frame frame) // Copy to next Frame

partial void AllocUser() // Allocate space
partial void FreeUser() // Free allocated space

노트: 프레임에 과도한 양의 데이터를 추가하면 성능(비직렬화/비직렬화)뿐만 아니라 늦게 참여할 때도 영향을 미칩니다.

예제

다음은 수동 메모리 할당이 필요하지 않은 매우 간단한 예제입니다.

C#

using System;

namespace Quantum {
    unsafe partial class Frame    {
        public byte[] Grid => _grid;
        private byte[] _grid;

        partial void InitUser() {
            _grid = new byte[RuntimeConfig.GridSize];
        }

        partial void SerializeUser(FrameSerializer serializer)
        {
            serializer.Stream.SerializeArrayLength<Byte>(ref _grid);
            for (int i = 0; i < Grid.Length; i++)
            {
                serializer.Stream.Serialize(ref Grid[i]);
            }
        }

        partial void CopyFromUser(Frame frame)
        {
            Array.Copy(frame._grid, _grid, frame._grid.Length);
        }
    }
}
Back to top