部分弃用。 本文中所述的帧关联技术依赖
XGameStreamingGetAssociatedFrame 和 XGameStreamingGetLastFrameDisplayed,这些函数自 2604 GDK 版本起被弃用,并将在未来版本中被移除。通用延迟测量 API XGameStreamingGetStreamAddedLatency 仍然可用。有关不依赖帧关联的延迟感知技术,请参阅 游戏串流延迟测量。
延迟补偿
为了补偿如图 1 所示示例中的延迟,游戏会保留其先前状态的记录。 当用户按下跳跃按钮时,游戏会搜索游戏中的该时点,以确定用户是否从他们的角度在正确的时刻按下了按钮。 正确的延迟补偿关键在于知道应向过去搜索多远。XBOX 游戏串流 API 为此提供了几种选项。平均延迟
对于某些情景而言,最简单但最不精确的方法是使用平均延迟。 XGameStreamingGetStreamAddedLatency API 返回由串流带来的最近平均延迟。该平均值分为输入延迟和输出延迟。 输入延迟是用户输入被服务器接收所需的时间,输出延迟是游戏渲染的视频帧被客户端设备接收和处理所需的时间。 对于基于时间的操作,游戏可以使用此平均值作为动作发生时点的估算。然而,网络延迟可能会有所变化,甚至逐帧变化,因此这种方法并不精确。此外,串流增加的延迟测量不包括非串流部分的延迟,例如游戏运行模拟和渲染所需的时间。带输入的帧令牌
XGameStreamingGetAssociatedFrame API 通过提供有关用户按下按钮(或更改任何其他输入)时所看到的游戏状态的精确信息,帮助解决此问题。 当一帧开始时,使用 Microsoft Game Development Kit (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 可能会返回更新帧的令牌。