游戏流式处理自定义分辨率的最佳做法

自定义分辨率允许游戏在流式处理时以多种分辨率和纵横比渲染。 本文档概述了 Microsoft 关于如何最佳使用它的建议。

选择最佳分辨率

玩家会将游戏流式传输到各种设备,包括手机、平板电脑、电脑和电视。 这些设备涉及从低分辨率到高分辨率显示器,以及从超宽屏 32:9 监视器到方形平板电脑和高纵向设备。 玩家更愿意让游戏填充他们的整个屏幕或窗口,没有上下黑边。 在可能的情况下,如果图片与客户端的显示器匹配而无需缩放,则也会更加清晰。 最后,客户端的理想分辨率可能取决于硬件和网络条件。

XGameStreamingGetDisplayDetails API 会考虑所有这些因素,并返回“首选”宽度和高度。 在理想情况下,“首选”分辨率是客户端屏幕的分辨率和纵横比,但如果该分辨率不可行,则将是符合传递给 XGameStreamingGetDisplayDetails 的流和参数之约束的最接近分辨率和纵横比。

如果游戏可以渲染任何分辨率,只需调用 XGameStreamingSetResolution 并将渲染分辨率设置为首选分辨率即可获得最佳效果。

许多游戏都是为固定的一组分辨率设计的。 例如,游戏可能有一个电脑版本支持多种分辨率,即使 Xbox 上的分辨率通常会缩小到一种。 在这种情况下,Microsoft 建议使用首选分辨率作为指导,以选择游戏支持的最接近分辨率。 执行此操作的一个好方法是找到最接近首选纵横比的匹配项,以便游戏尽可能填充客户的屏幕。 请注意,XGameStreamingDisplayDetails 结构包括可设置的分辨率限制。 它还包括指示当前流是否支持非标准分辨率和当前缩放的标志。

如果自动选择分辨率不可行,但游戏的电脑版本包含分辨率选取器,你也可以允许玩家选择分辨率,前提是这些分辨率符合 XGameStreamingDisplayDetails 约束。

侦听更新

在流期间,最佳分辨率可能会因以下几个原因而改变:

  1. 在云服务器上,游戏是在流式处理客户端连接之前启动的,因此无法立即获得首选分辨率。
  2. 使用手机或平板电脑的玩家可以在纵向和横向之间旋转设备。
  3. 使用电脑的玩家可以调整流式处理客户端窗口的大小或切换全屏显示。
  4. 网络条件可能会发生变化,需要不同的流分辨率。

若要在发生更改时提供最佳流式处理体验,请使用 XGameStreamingRegisterConnectionStateChanged 检测新客户端,并使用 XGameStreamingRegisterClientPropertiesChanged (检查 XGameStreamingClientProperty::DisplayDetails 属性) 以检测客户端的首选分辨率何时发生更改。 当这些事件发生时,请更改分辨率以匹配新的 XGameStreamingDisplayDetails

注意

至少,为云服务器上的玩家处理初始客户端连接事件以获取匹配的分辨率非常重要。

更改限制

更改流分辨率时,玩家会看到短暂闪烁(就像在电脑上更改游戏分辨率那样)。 为了最大程度地减少中断,Microsoft 建议仅为响应上述事件而更改分辨率。

除了玩家体验之外,不建议每 200 毫秒多次更改流分辨率,因为视频编码器可能没有时间匹配游戏分辨率,从而引起短暂的视觉拉伸。 上述事件每 200 毫秒不会触发多次。

设置 XGameStreamingGetDisplayDetails 的参数

XGameStreamingGetDisplayDetails API 包括游戏约束的参数。 如果这些参数设置正确,API 将计算符合这些约束的最佳分辨率。 参数包括:

maxSupportedPixels:这是游戏不应超过的总像素计数。 保持性能的一个好的经验法则是将游戏通常在当前系统设备类型上渲染的宽度和高度相乘。 例如,如果游戏通常在 Xbox Series S 上渲染 1440p,则在该设备类型上传递 maxSupportedPixels=2560*1440=3686400。

widestSupportedAspectRatiotallestSupportedAspectRatio:这些是游戏的纵横比限制。 将这些参数设置为你测试过的最宽和最高纵横比可确保你的游戏在所有设备上看起来都不错。

触控输入和自定义分辨率

通过 XGameStreamingSetResolution 更改分辨率会更改触控输入坐标空间以匹配新的纵横比。 GameInputTouchState 包括标准化 0-1 范围内的触控坐标。 更改分辨率时,该范围保持不变,但现在表示新的分辨率。 例如,在 1920x1080 游戏中,如果没有自定义分辨率,触控 (0.5, 0.5) 代表 (960, 540),但调用 XGameStreamingSetResolution 更改为 1600x800 意味着触控 (0.5, 0.5) 表示 (800, 400)。 请注意,更改分辨率时,GameInputTouchSensorInfo 中的分辨率和纵横比值不会更新;使用传递给 XGameStreamingSetResolution 的值,而不是使用 GameInputTouchSensorInfo 计算触控位置。

安全区域

许多设备的屏幕部分遮挡,被凹口、圆角和覆盖的滑动条遮住。 XGameStreamingDisplayDetails 包含一个 safeArea 矩形,用于描述屏幕中心内的非遮蔽矩形。 若要确保重要内容可见,请将此矩形视为游戏安全空间的边界。 它之外的区域可能可见,并且仍应包含内容,但不包含重要的 UI 元素。

DirectCapture

最佳的流视频体验是游戏结合自定义分辨率和 DirectCapture,从而降低流式处理延迟。 有关如何确保游戏受益于 DirectCapture 的信息,请参阅 DirectCapture 概述

另请参阅

自定义分辨率概述

使用自定义分辨率进行测试(NDA 主题)要求授权

DirectCapture 概述