Partager via


XGameStreamingGetLastFrameDisplayed

Gets the frame pipeline token for the frame that was most recently displayed on the streaming client's screen.

Syntax

HRESULT XGameStreamingGetLastFrameDisplayed(  
         XGameStreamingClientId client,  
         D3D12XBOX_FRAME_PIPELINE_TOKEN* framePipelineToken  
)  

Parameters

client   _In_
Type: XGameStreamingClientId

The ID of the streaming client device that is being queried.

framePipelineToken   _Out_
Type: D3D12XBOX_FRAME_PIPELINE_TOKEN*

The frame pipeline token that was last displayed on the client device.

Return value

Type: HRESULT

Returns S_OK if successful; otherwise, returns an error code.

Potential Errors

Error Code Error Value Reason for Error
E_GAMESTREAMING_NOT_INITIALIZED 0x89245400 The XGameStreaming runtime has not been initialized. Call XGameStreamingInitialize before calling other APIs.
E_GAMESTREAMING_CLIENT_NOT_CONNECTED 0x89245401 The specified client is not connected.
E_GAMESTREAMING_NO_DATA 0x89245402 The requested data is not available. The data may be available later.

Remarks

When a player is streaming a game, XGameStreamingGetLastFrameDisplayed can be utilized if the game needs to change game behavior upon confirmation that a particular frame was displayed on the user's screen.

Some examples of when a game may utilize this include:

  • A visual timer has expired and the player took no action before the expiration.
  • An action was not taken within the appropriate window.
  • A player continued their motion out of bounds and did not take action to recover.

XGameStreamingGetLastFrameDisplayed should be used when trying to determine when an action should have been taken, but wasn't. In the case where the game needs to determine what was being displayed when an input was done by the player, the game should utilize XGameStreamingGetAssociatedFrame.

Example

// In this example, when processing input, the game would like to pass along the last frame 
// that was being displayed to the player so that their simulation engine can take that into account.
 

// The framePipelineToken was initially captured at the callback of WaitFrameEventX

void Game::Update(DX::StepTimer const& timer)
{
    ...

    D3D12XBOX_FRAME_PIPELINE_TOKEN framePipelineToken = D3D12XBOX_FRAME_PIPELINE_TOKEN_NULL;
    if SUCCEEDED(XGameStreamingGetLastFrameDisplayed(clientId, &framePipelineToken)
    {
        SimulateBasedOnLastFrameDisplayed(framePipelineToken);
    }
    else 
    {
        // don't have last token, potentially simulate based on current frame

        SimulateBasedOnCurrentFrame();
    }

    
      
    ...
}

Requirements

Header: xgamestreaming.h

Library: xgameruntime.lib

Supported platforms: Windows, Xbox One family consoles and Xbox Series consoles

See also

XGameStreamingGetAssociatedFrame
XGameStreaming
Game Streaming Latency Compensation Overview