XGameStreamingGetDisplayDetails
此 API 返回指定客户端的显示详细信息。 这可用于做出明智的决策,例如要呈现的自定义纵横比,或用于启用 DirectCapture 的分辨率。
语法
HRESULT XGameStreamingGetDisplayDetails(
XGameStreamingClientId client,
uint32_t maxSupportedPixels,
float widestSupportedAspectRatio,
float tallestSupportedAspectRatio,
XGameStreamingDisplayDetails* displayDetails
)
参数
client _In_
类型:XGameStreamingClientId
正在被查询的流式处理客户端。
maxSupportedPixels _In_
类型:uint32_t
游戏支持的最大像素数。
widestSupportedAspectRatio _In_
类型:float
游戏支持的最宽纵横比。 这是使用所支持的最宽分辨率根据宽度/高度计算的。
tallestSupportedAspectRatio _In_
类型:float
游戏支持的最高纵横比。 这是使用所支持的最高分辨率根据宽度/高度计算的。
displayDetails _Out_
类型:XGameStreamingDisplayDetails*
流式处理客户端的显示详细信息。
返回值
类型:HRESULT
如果成功,则返回 S_OK;否则返回错误代码。
可能的错误
错误代码 | 错误值 | 错误原因 |
---|---|---|
E_GAMESTREAMING_NOT_INITIALIZED | 0x89245400 | XGameStreaming 运行时尚未初始化。 在调用其他 API 之前,先调用 XGameStreamingInitialize。 |
E_GAMESTREAMING_CLIENT_NOT_CONNECTED | 0x89245401 | 指定客户端未连接。 |
E_GAMESTREAMING_NO_DATA | 0x89245402 | 请求的数据目前不可用, 数据可能稍后可用。 |
E_INVALIDARG | 0x80070057 | 一个或多个参数无效。
maxSupportedPixels 必须大于 0。
widestSupportedAspectRatio 必须等于或大于 16/9,并且不能是无限的。
tallestSupportedAspectRatio 必须等于或小于 16/9,并且必须大于 0。 |
有关错误代码的列表,请参阅错误代码。
备注
displayDetails
中的数据可用于驱动游戏的各个方面,例如用于呈现游戏的分辨率,以及通知在何处放置关键信息或 UI 以确保其可交互且不被遮盖。
displayDetails
结构中的 preferredWidth
和 preferredHeight
基于流式处理客户端上的实际显示、基于流式处理系统的限制,以及游戏提供的参数(maxSupportedPixels
、widestSupportedAspectRatio
、tallestSupportedAspectRatio
)。
请记住,数据可能在游戏启动时不可用,并且在客户端连接事件时可能不一定可用,因此游戏应使用事件或轮询。
示例
#define DEFAULT_GAME_WIDTH 1920
#define DEFAULT_GAME_HEIGHT 1080
#define GAME_WIDEST_SUPPORTED_ASPECT_RATIO 21.5f / 9.0f
#define GAME_TALLEST_SUPPORTED_ASPECT_RATIO 16.0f / 10.0f
static uint32_t s_currentStreamWidth = DEFAULT_GAME_WIDTH;
static uint32_t s_currentStreamHeight = DEFAULT_GAME_HEIGHT;
// Option 1: Event driven. Note: be aware of potential threading issues when using the task queue.
void GameStreamingClientManager::OnConnectionStateChanged(XGameStreamingClientId client, XGameStreamingConnectionState connected)
{
// Other connection work like registering or unregistering for the client properties change events.
...
UpdateResolutionIfNeeded();
}
void GameStreamingClientManager::OnClientPropertiesChanged(
XGameStreamingClientId client,
uint32_t updatedPropertiesCount,
XGameStreamingClientProperty* updatedProperties)
{
for (uint32_t i = 0; i < updatedPropertiesCount; ++i)
{
switch (updatedProperties[i])
{
case XGameStreamingClientProperty::DisplayDetails:
{
UpdateResolutionIfNeeded();
break;
}
default:
// A characteristic we are not tracking - do nothing
break;
}
}
}
// Option 2: Polling.
void Game::Update(DX::StepTimer const& timer)
{
...
gameStreamingClientManager->UpdateResolutionIfNeeded();
...
}
void GameStreamingClientManager::UpdateResolutionIfNeeded()
{
bool changeResolution = false;
bool useDefaultResolution = true;
// Only use custom resolution when there is only one streaming client connected.
if (XGameStreamingGetClientCount() == 1)
{
XGameStreamingClientId client;
uint32_t clientsUsed = 0;
HRESULT hr = XGameStreamingGetClients(1, &client, &clientsUsed);
if (SUCCEEDED(hr) && clientsUsed == 1)
{
XGameStreamingDisplayDetails displayDetails = {};
hr = XGameStreamingGetDisplayDetails(client, DEFAULT_GAME_WIDTH * DEFAULT_GAME_HEIGHT, GAME_WIDEST_SUPPORTED_ASPECT_RATIO, GAME_TALLEST_SUPPORTED_ASPECT_RATIO, &displayDetails);
if (SUCCEEDED(hr))
{
useDefaultResolution = false;
// Assuming the game supports all resolutions, use the stream resolution to the preferred dimensions as provided.
if (s_currentStreamWidth != displayDetails.preferredWidth || s_currentStreamHeight != displayDetails.preferredHeight)
{
changeResolution = true;
s_currentStreamWidth = displayDetails.preferredWidth;
s_currentStreamHeight = displayDetails.preferredHeight;
}
}
else
{
LogFormat(L"XGameStreamingGetDisplayDetails failed %x", hr);
}
}
else
{
LogFormat(L"XGameStreamingGetClients failed hr=%x clientsUsed=%d", hr, clientsUsed);
}
}
if (useDefaultResolution)
{
if (s_currentStreamWidth != DEFAULT_GAME_WIDTH || s_currentStreamHeight != DEFAULT_GAME_HEIGHT)
{
changeResolution = true;
s_currentStreamWidth = DEFAULT_GAME_WIDTH;
s_currentStreamHeight = DEFAULT_GAME_HEIGHT;
}
}
if (changeResolution)
{
// Update the stream to the new resolution.
HRESULT hr = XGameStreamingSetResolution(s_currentStreamWidth, s_currentStreamHeight);
if (SUCCEEDED(hr))
{
// Update the game to render at the new resolution.
}
else
{
LogFormat(L"XGameStreamingSetResolution failed %x", hr);
}
}
}
要求
头文件:xgamestreaming.h
库:xgameruntime.lib
支持平台:Windows、Xbox One 系列主机和 Xbox Series 主机