Share via


게임 스트리밍 대기 시간 보상 심층 분석

이 항목을 사용하여 Xbox 게임 스트리밍을 사용하여 플레이할 때 타이틀의 대기 시간 보정을 결정할 수 있습니다.

비디오 게임에는 빠른 동작을 위해 시간에 민감한 입력 처리가 포함됩니다. 그림 1과 같이 사용자의 캐릭터가 절벽으로 향하는 움직이는 컨베이어 벨트에 있는 플랫포머를 가정해 보겠습니다.

사용자는 적시에 점프해야 합니다. 너무 이르면 다음 플랫폼을 놓치고 너무 늦게 점프하면 점프하기 전에 넘어집니다. 게임 스트리밍의 네트워크 대기 시간은 사용자가 점프할 올바른 위치에서 자신의 캐릭터를 볼 때쯤이면 Xbox 서비스의 관점에서 이미 끝이 났을 수 있음을 의미합니다.

게임이 결국 네트워크를 통해 단추를 누르면, 사용자가 오른쪽 비디오 프레임의 단추를 자신의 관점에서 눌렀더라도, 추락 점수로 기록될 수 있습니다.

그림 1. 컨베이어에서 문자가 있는 플랫폼의 예

컨베이어에 문자가 있는 플랫폼의 스크린샷

대기 시간 보정

그림 1에 표시된 예시에서 대기 시간을 보완하기 위해 게임에는 이전 상태의 레코드가 있습니다.

사용자가 점프 단추를 누르면 게임이 해당 지점을 검색하여 사용자가 자신의 관점에서 해당 단추를 제시간에 누른지 확인할 수 있습니다.

지연 시간 보상을 수정하는 핵심은 과거의 검색 시간을 알고 있어야 한다는 것입니다. Xbox 게임 스트리밍 API를 사용하면 몇 가지 옵션을 사용할 수 있습니다.

평균 대기 시간

일부 시나리오에서 가장 간단하지만 덜 정확한 접근 방식은 평균 대기 시간을 사용하는 것입니다.

XGameStreamingGetStreamAddedLatency API는 스트리밍에 의해 추가된 최근 대기 시간 평균을 반환합니다. 해당 평균은 입력 대기 시간 및 출력 대기 시간으로 분할됩니다.

입력 대기 시간(플레이어 입력이 서버에서 수신되는 데 걸리는 시간)과 출력 대기 시간(게임에 의해 렌더링된 비디오 프레임이 클라이언트 디바이스에서 수신 및 처리되는 시간)입니다.

시간 기반 작업의 경우, 이 평균을 동작이 발생한 시간의 예측으로 사용할 수 있습니다. 그러나 프레임 간에도 네트워크 대기 시간이 다를 수 있으므로 이 접근 방식은 정확하지 않습니다. 또한 스트림이 추가된 대기 시간 측정치에는 대기 시간의 비 스트리밍 부분(예: 게임이 시뮬레이션과 렌더링을 실행하는 데 걸리는 시간)은 포함되지 않습니다.

프레임 토큰(입력 포함)

XGameStreamingGetAssociatedFrame API를 사용하면 사용자가 단추를 눌렀을 때(또는 다른 입력을 변경했을 때) 표시된 게임 상태에 관한 정확한 정보를 제공하여 이 문제를 해결할 수 있습니다.

프레임이 시작되면 Microsoft GDK(게임 개발 키트)를 사용하는 게임은 ID3D12Device::WaitFrameEventX을(를) 호출하고 D3D12XBOX_FRAME_PIPELINE_TOKEN을(를) 받습니다. D3D12XBOX_FRAME_PIPELINE_TOKEN을(를) 키로 사용하여 현재 상태를 나중을 위해 해시 맵 같은 원하는 데이터 구조에 저장할 수 있습니다. 프레임이 완료되면 게임에서 토큰과 함께 PresentX을(를) 호출합니다.

PresentX은(는) 일치하는 비디오 프레임과 함께 토큰이 자동으로 게임 스트리밍 클라이언트로 전송되도록 합니다.

서버에 전송된 입력에는 현재 클라이언트에 표시되는 프레임에 대한 토큰이 함께 표시됩니다. 게임이 IGameInputReading을(를) 받으면 토큰을 다시 받기 위해 XGameStreamingGetAssociatedFrame API에 전달할 수 있습니다. 이 토큰을 사용하여 이전 상태를 조회하고 저장된 이 상태를 기준으로 입력을 처리할 수 있습니다.

참고 항목

입력이 변경되지 않은 경우(사용자가 컨트롤러를 건드리지 않았기 때문이거나 사용자가 단추를 누르고 있기 때문에)에는 새 토큰이 없습니다.

프레임 토큰(입력 없음)

경우에 따라 플레이어 입력이 변경되지 않은 경우에도 사용자에게 최근에 표시된 내용을 알고 있어야 합니다. 그림 1에 표시된 예제로 돌아가 보면, 캐릭터가 컨베이어 벨트 끝에 도달하면 추락합니다. 게임의 도전과 공정성의 일부는 이러한 시간 내에 반응하는 것입니다.

이상적으로는 스트리밍 사용자가 비스트리밍 사용자만큼 반응하는 데 시간이 오래 걸리는 것이 좋습니다. 지연 시간으로 인해 창의 종료 시간을 이동하여 창의 끝에서 수신되는 입력이 허용되도록 해야 합니다.

그러기 위해, 게임은 단추가 눌리지 않은 위치에서 대기 시간 토큰을 사용할 수 있습니다. 동작이 없는 입력 측정값이 시간 창 끝의 상태와 일치하는 경우 사용자는 반응하지 못하고 이에 따라 게임에서 불이익을 받을 수 있습니다.

XGameStreamingGetLastFrameDisplayed API는 스트리밍 클라이언트에 최근에 표시된 프레임에 대해 D3D12XBOX_FRAME_PIPELINE_TOKEN울(를) 반환합니다. 지속적으로 업데이트되므로 토큰을 언제든지 호출하여 사용자에게 애니메이션의 끝이 표시되었는지를 확인할 수 있습니다.

참고 항목

XGameStreamingGetAssociatedFrame과(와) 같이 XGameStreamingGetLastFrameDisplayed을(를) 사용할 수 있습니다. 입력이 발생하면 화면에 토큰을 반환하므로 처리할 때 XGameStreamingGetAssociatedFrame을(를) 사용하는 것이 좋습니다. XGameStreamingGetLastFrameDisplayed이(가) 더 많은 시간을 경과한 경우 최신 프레임에서 토큰을 반환할 수 있습니다.

더 많은 시나리오

이전 섹션의 세 가지 API를 사용하여 다양한 시나리오에서 대기 시간을 보상할 수 있습니다. 다음 섹션에서는 일반적인 다중 사용자 대기 시간 보상 기술을 기반으로 하는 더 많은 예제를 제공합니다.

이동

캐릭터, 카메라 또는 조준의 이동은 두 가지 범주에 해당할 수 있습니다.

별개의 결과가 따르는 이동

사용자가 충돌하거나 조준하고 발사할 때, 게임은 사용자가 관찰할 수 있는 움직임의 결과에 대한 결정을 내려야 합니다.

이런 경우에는 결정이 필요한 위치에서 게임이 프레임과 상호 관련된 입력을 수신할 때까지 일반적으로 이진 결정이 지연될 수 있습니다. 충돌이나 절벽 추락과 같은 동작의 경우, 대기 중에 애니메이션 효과를 주어야 할 수도 있습니다.

예를 들어, 사용자가 실제 입력을 수신하는 데 걸리는 시간 동안 물체에 클립을 끼우거나, 절벽 위로 띄우거나 뛰어내릴 수 있습니다.

일반 이동

일반적인 움직임은 어떤 탐색이나 목표이지만, 주어진 프레임에서 일어나는 것보다 누적된 움직임이 더 중요한 운전과 같은 경우에는 중요할 수 있습니다.

입력 투영

이 게임은 입력 기록을 사용하여 사용자가 입력을 제공한 프레임을 본 후 경과한 시간을 기준으로 전진 투사할 수 있습니다. 예를 들어, 썸스틱의 좌표가 0.5이고 지연 시간 토큰이 3프레임인 동안 프레임당 평균 0.1이 진행되면 게임은 0.8인 것처럼 처리할 수 있습니다.

물론 사용자가 속도와 방향을 변경하면 잘못된 예측이 될 수 있습니다. 사용자의 실제 입력을 통합하기 위해 게임은 이전에 예측한 상태의 버퍼를 유지할 수 있습니다. 해당 상태에 관한 실제 입력이 표시되면 게임은 해당 상태에서 실제 입력을 사용하여 시뮬레이션을 다시 실행하여 가시적인 상태를 수정할 수 있습니다.

위에서 언급했듯이, 게임에서 실제 입력이 인식될 때까지 결과 트리거를 대기해야 합니다. 이 경우 연결 대기 시간이 길어지면서 가시적인 "표시"로 이어질 수 있으며 게임은 다듬기나 잘못된 예측에 관한 다른 수정을 제공할 수도 있습니다.

이 전략으로 렌더링된 프레임은 클라이언트에 액세스하는 데 더 많은 시간이 걸립니다. 게임은 사용자의 보기를 서버의 시뮬레이션과 동기화하기 위해 평균 출력 지연 시간만큼 더 멀리 투영할 수 있습니다. 이 기능은 서버 시뮬레이션의 속도가 외부 다중 사용자 서버에 의해 제어될 수 있는 다중 사용자 게임에서 더 중요할 수 있습니다.

게임별 예측

게임은 입력 기록을 추정하는 대신 사용자가 수행할 동작을 더 정확히 파악할 수도 있습니다. 단순한 추론(예: 2차원 플랫포머 캐릭터가 오른쪽으로 이동)부터 사용자 기록을 기반으로 한 기계 학습에 이르기까지 다양할 수 있습니다. 입력 추정의 경우와 마찬가지로, 게임은 예측의 버퍼를 유지하고 실제 입력이 들어오면 시뮬레이션을 다시 실행할 수 있습니다.

터치 추적

네이티브 터치를 사용하는 게임은 사용자의 손가락 아래에 커서나 지갑을 배치할 수 있습니다. 대기 시간이 길면 이동하는 손가락 뒤를 커서가 따르는 것이 사용자에게 포착됩니다. 이 항목의 일반 이동 섹션에서 언급했듯이, 게임은 일반적으로 움직이는 손가락 아래에 커서를 두기 위해 터치 입력의 이동 방향과 속도를 예측할 수 있습니다.

다중 사용자

Xbox 게임 스트리밍에서 실행되는 다중 사용자 게임의 장점은 사용자의 Xbox 서버가 동일한 Azure 데이터 센터에 있을 가능성이 높다는 것입니다. 게임의 다중 사용자 서버도 해당 Azure 지역에 있다면 Xbox와 멀티 사용자 서버 사이의 대기 시간은 밀리초보다 짧습니다. 그러나 사용자의 클라이언트 장치는 더 멀어지게 됩니다.

다중 사용자 게임에는 일반적으로 게임과 다중 사용자 서버 간의 대기 시간을 처리하는 전략이 포함되어 있습니다. 종종 이러한 전략에는 다중 사용자 서버의 타임스탬프 또는 프레임 카운터가 수반됩니다.

이러한 타임스탬프와 카운터를 프레임 토큰과 연결하면 다중 사용자 게임은 대기 시간 계산에 스트림을 포함할 수 있습니다. 그러면 다중 사용자 게임이 스트리밍 사용자에게 제대로 표현될 뿐만 아니라 스트리밍 플레이어와 비 스트리밍 사용자 사이에 공정한 경쟁 환경을 제공하는 데에도 도움이 됩니다.

참고 항목

게임 스트리밍 대기 시간 보상 개요
게임 스트리밍 대기 시간 측정
게임 테스트가 진행되는 동안 대기 시간 시뮬레이션
XGameStreaming(API 콘텐츠)