Microsoft 游戏开发工具包 (GDK) 为:
目前由游戏开发者使用的一组公共的、典型 Windows API,它不仅面向当今的电脑,还可用于所有 Microsoft Gaming 终结点,包括最新一代的 Xbox 主机
为通过游戏开发者友好的编程模型和设计进行集成而设计的一组游戏服务、工具和扩展,包括:
- 标准 Win32 样式 C API 或 DX 样式 C++ API
- 返回错误代码并且不引发异常的 API
- 使用熟悉的异步编程模式的 API
在 Xbox 上,这意味着:
- 为正在运行的游戏进行了优化的小型、快速、安全的操作系统
- 明确保证 CPU、GPU、内存资源和 I/O 速率可供您的游戏使用的操作系统
- 针对硬件本身进行了优化并且使您可以在现在和将来在 Xbox 平台上充分利用您的游戏性能的特定于 Xbox 的扩展(例如 DX12x)
- 一种版本控制模型,与 Xbox 目前提供的模型类似,其中,游戏操作系统与游戏一起交付
- 一种更简单的内存模型,可帮助您了解并跟踪您的游戏内的内存使用情况
- 对"F5"部署、安装和测试迭代以及消除Xbox One ERA 模型中出现的激活失败进行了显著的可靠性改进
- 一种将现有基于 Windows 的代码引到 Xbox 并且可以增加代码可重用性和可维护性的更简便方法
在电脑上,这意味着:
- 能够开发、测试和使用(就像在 Xbox 上一样)多种 Microsoft 游戏服务(包括 Connected Storage、Xbox 服务以及全套辅助功能)的能力
- 一种方法,用于利用以前 Xbox 独有的打包和引入系统、轻松地将您的游戏交付到 Microsoft Store 以及参与 PC GamePass 之类的 Microsoft 游戏计划
Microsoft 游戏开发工具包 (GDK) 编程模型
- API 是
- 扁平的 C:典型的 Win32 样式 C API
- 简单的 C++:D3D 样式 C++ API
- API 不引发异常;它们返回错误代码。
- 在 Xbox 上,UTF-8 是采用字符串值的所有 API 的默认设置。
- 在电脑以及 Xbox 上,UTF-8 是在游戏运行时采用字符串值的所有 API 的默认设置。
- 在电脑上,核心 Win32 游戏 API 遵循针对游戏相关的所有 API 的字符串值的 Windows API 约定,这些 API 不是游戏运行时的一部分。
重要说明:在 Xbox 上,Microsoft 游戏开发工具包 (GDK) 仅支持 D3D12.x。
D3D11.x 不受支持。 如果你的游戏使用 D3D11.x,则在移动到 Microsoft 游戏开发工具包 (GDK) 时,需要移动到 D3D12.x。 在 Windows 电脑上,D3D11 和 D3D12 均受到支持。
Microsoft 游戏开发工具包 (GDK) 编程模型包括:
核心 Win32 游戏 API: 这是适用于跨 Windows 电脑、Xbox 和 Xbox 游戏流式处理(具有某些 Windows 版本依赖项)的游戏的 Win32 API 的常见子集。 示例包括现有 Win32 文件 I/O(CreateFile、OpenFile、ReadFile 和 WriteFile)、WinSock2、XInput 和 D3D12(或 Xbox 上的 D3D12.x)API。 这些 API 作为电脑上 Windows 操作系统以及 Xbox 上游戏操作系统的一部分交付。
游戏运行时:此组组件有助于在 Microsoft 平台上实现当今流行的跨设备游戏。 游戏运行时包括对 MSIXVC 打包、安装管理、连接的存储(游戏保存)、辅助功能和商店商务的支持。 Xbox 服务支持依赖于游戏运行时中的组件。 在 Windows 电脑上,游戏运行时作为一个单独的 Microsoft Store–服务包交付,并且这有助于电脑游戏对其的依赖。 在 Xbox 上,游戏运行时作为游戏操作系统的一部分交付。
游戏运行时依赖于电脑上的 Windows 10 19H1 版本。
按区域划分的公共编程模型
区域 | API |
---|---|
应用程序模型 | WinMain 和 Win32 消息循环 激活不适用(激活不属于编程模型) RegisterAppStateChangeNotification API RegisterForGameInvites API |
网络 | WinSock2、WinHTTP |
文件 I/O | Win32 文件 I/O API |
内存 | 具有针对 Xbox 的扩展的 Win32 内存 API (XMemAlloc要求授权) |
图形 | 电脑上的 D3D12 和 D3D11 Xbox 上的 D3D12.x |
音频 | 具有针对 Xbox 的扩展和 XMA 支持的 XAudio2要求授权 WASAPI要求授权 ISpatialAudioClient要求授权 |
视频 | 完全支持电脑上的 ID3D11Video API 和媒体基础 Xbox 上的 MFSourceReader 和相关 API(与 XBOX ONE ERA 相同) 在 Xbox 上没有编码支持 |
GameDVR/广播 | 全新的扁平 C API:XAppCapture |
输入 | 用于更高级用力的针对 GamePad 或 GameInput(全新的简单 C++ API)的 XInput |
连接的存储 | 全新的扁平 C API:XGameSave |
标准 UI (TCUI) | 全新的扁平 C API:XGameUI |
打包和流式安装 | 全新的扁平 C API:XPackage |
Xbox 服务 API (XSAPI) | 全新的扁平 C API:XSAPI 参考 |
Store | 全新的扁平 C API:XStore |
Microsoft 游戏开发工具包 (GDK) 游戏的简单示例
为了说明 Microsoft 游戏开发工具包 (GDK) 游戏只是 Win32>游戏中,我们包含来自默认 SDK 项目的代码片段:
. . . .
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE, _In_ LPWSTR lpCmdLine, _In_ int) {
. . . .
if (FAILED(XGameRuntimeInitialize())) return 1;
. . . .
// Register class
WNDCLASSEXA wcex = {};
wcex.cbSize = sizeof(WNDCLASSEXA);
. . . .
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
if (!RegisterClassExA(&wcex)) return 1;
// Create window
HWND hwnd = CreateWindowExA(. . . .);
if (!hwnd) return 1;
ShowWindow(hwnd, nCmdShow);
SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(g_game.get()));
. . . .
// Main message loop
MSG msg = {};
while (WM_QUIT != msg.message) {
if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} else {
g_game->Tick();
}
}
. . . .
XGameRuntimeUninitialize();
return (int) msg.wParam;
}
. . . .
// Windows procedure
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
auto game = reinterpret_cast<Game*>(GetWindowLongPtr(hWnd, GWLP_USERDATA));
switch (message) {
case WM_CREATE:
break;
. . . .
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
// Exit helper
void ExitGame() {
PostQuitMessage(0);
}
你可以看到,这和经典“Win32”游戏一样,有 wWinMain、Message Loop 和 WndProc。 仅有的区别如下:
- 如果你正在电脑或 Xbox 上使用游戏运行时(针对 Xbox 的要求,因为 Xbox 服务依赖于它),则必须调用 XGameRuntimeInitialize 和 XGameRuntimeUninitialize。
- Xbox 具有针对挂起、约束和恢复 PLM 状态的回调。
- Xbox 仅支持对主机有意义的 WM_* messages 消息的子集。
SDK
若要生成 Microsoft 游戏开发工具包 (GDK) 游戏,需要安装以下 SDK:
-
Windows 软件开发工具包 (SDK)
标准的公共 20H1 Windows 10 SDK。 可在此处下载。
自 2023 年 10 月版本起,现在需要 Windows 11 SDK。 可在此处下载。
Microsoft 游戏开发工具包
Microsoft 游戏开发工具包 (GDK) 是我们的新>保护程序 SDK>。 现在,它包含游戏运行时开发工具包 (GRDK) 和游戏扩展开发工具包 (GXDK)。 将来,它将包含其他游戏 SDK。
游戏运行时开发工具包 (GRDK) 包含开发用于电脑和 Xbox 的游戏(使用 MSIXVC 之类的游戏运行时功能)所需的头文件、库和工具。 GRDK 还包括游戏运行时的 PC redist 的开发者版本。
游戏扩展开发工具包 (GXDK) 是 Xbox 开发工具包 (XDK) 的 Microsoft 游戏开发工具包 (GDK) 版本。 GXDK 包含生成适用于 Xbox 的 Microsoft Game Development Kit (GDK) 游戏所需的标头、库、工具和Visual Studio集成。 例如,D3D12.x 标头和 xb* 远程管理工具是 GXDK 的一部分。
有关 Microsoft 游戏开发工具包 (GDK) 的 SDK 结构的重要说明
自 2020 年 5 月 GDK 起,Microsoft 游戏开发工具包 (GDK) 中包含的更新后的 Windows 标头和库已删除,因为该功能现已包含在 19041 版本的Windows SDK中。 若要使用 GDK 开发游戏,这需要安装 Windows 19041 SDK(可here.) 和 Microsoft 游戏开发工具包 (GDK) 下载。
支持 Visual Studio
Microsoft 游戏开发工具包 (GDK) 支持 Visual Studio 2019要求授权 或 Visual Studio 2022要求授权。
开发操作系统要求
开发电脑:支持 Windows 7 或更高版本作为开发平台,尽管我们推荐 Windows 10 的最新版本。
在电脑上使用游戏运行时的测试游戏:Windows 19H1 是针对开发和零售方案的使用游戏运行时功能的电脑游戏的最低 Windows 操作系统版本。
在 Xbox 上使用游戏操作系统和游戏运行时的测试游戏:
Microsoft 游戏开发工具包 (GDK) 预览版中包含支持 Microsoft 游戏开发工具包 (GDK) 的预览版 Xbox 恢复。 当前正式版主机版本不支持 Microsoft 游戏开发工具包 (GDK) 游戏。
生成适用于 Xbox 的 Microsoft 游戏开发工具包 (GDK) 游戏
若要生成仅面向 Microsoft 游戏开发工具包 (GDK) 中的核心 Win32 游戏 API 的游戏,请确保以下内容:
你将针对 Windows 标头中的 WINAPI_FAMILY_GAMES API 分区进行编译,且 WINAPI_FAMILY_GAMES 为“#defined”。 例如,使用
/D "WINAPI_FAMILY=WINAPI_FAMILY_GAMES"
生成。您正在链接 xgameplatform.lib umbrella lib 而不是 Win32 桌面 lib(kernel32、user32、gdi32 等),因为 xgameplatform.lib 仅包含 Microsoft Game Development Kit (GDK) 支持的 API。 此外,指定
/NODEFAULTLIB
链接器选项,以便删除所有默认库。 例如,默认 Xbox 项目模板链接 pixevt.lib、d3d12_x.lib、xgameplatform.lib 和 xgameruntime.lib,并且它指定/NODEFAULTLIB
。
如果不执行这些步骤,则可能会使用在 Xbox 上的游戏操作系统中不起作用的 API。
若要详细了解何时构建仅面向 Microsoft 游戏开发工具包 (GDK) 的游戏,请参阅下面的"在 电脑上交付游戏 并在 Xbox 主机上交付游戏 "。
有关详细信息,请参阅 使用 GDK 开发新游戏。
游戏运行时
游戏运行时是有助于在 Microsoft 平台上实现当今流行的跨设备游戏的一组组件。 游戏运行时包括以下内容:
组件 | 角色 |
---|---|
MSIXVC | 对支持 Xbox 主机和电脑的 Xbox 打包系统的更新;有关 MSIXVC 的详细信息,请参阅使用 MSIXVC 打包 |
安装管理 | 流式安装和智能交付 |
连接存储 | 基于云的游戏保存,称为 "游戏保存>在 Microsoft 游戏开发工具包 (GDK) 中 |
Microsoft Store 商务 | 应用内购买等 |
辅助功能 | 隐藏字幕、文本到语音和语音到文本 |
游戏邀请 | 允许玩家加入已开始的多人游戏会话 |
标准游戏 UI | 用于常见游戏工作流(包括 Xbox 服务)的标准化 UI |
在 Windows 电脑上:
可以选择是否使用游戏运行时。 目前,它仅支持在 Microsoft Store 中交付的游戏。
要在 Microsoft Store 中交付您的 Win32 游戏,您必须通过使用 MSIXVC 包装它,这要求您获取游戏运行时上的依赖关系。
您决定是否利用游戏运行时中的其他组件。 例如,您可以选择使用“连接的存储”以便在云中存储游戏保存。
运行游戏时作为 Microsoft Store–服务包发布。 这使得游戏不必依赖于新版本的 Windows 就可以依赖该运行时。 这还确保无需要求游戏内容更新,即可为运行时提供安全修补程序之类的关键更新。
游戏运行时依赖于 Windows 10 19H1 版本。 作为一个目标,在我们将新功能添加到游戏运行时之际,我们不依赖于 Windows 的更高版本。
在 Xbox 上:
你必须使用游戏运行时–打包为一个 MSIXVC、使用连接的存储以及支持 Xbox 服务是在 Xbox 上发布你的游戏的要求。
游戏运行时作为游戏操作系统的一部分提供。
电脑上的游戏运行时体系结构
XGameRuntime.lib:编译到游戏中。 针对游戏运行时的版本控制边界。
游戏运行时客户端:加载到游戏进程中。 管理与游戏运行时服务的通信。 在 Windows 电脑上,通过 Microsoft Store 提供。 在 Xbox 上,作为游戏操作系统的一部分提供。
游戏运行时服务 (GRTS):在单独的进程中运行。 在电脑上,通过 Microsoft Store 提供。 在 Xbox 上,作为游戏操作系统的一部分提供。
GameRuntime UI 应用:由游戏运行时客户端或 GRTS 调用以代表游戏显示 UI。 在 Windows 电脑上,通过 Microsoft Store 提供。 在 Xbox 上,作为恢复的一部分提供。
在 Windows 电脑上,存在一个游戏运行时客户端的已安装版本,游戏运行时服务;还有 GameRuntime UI 应用。 它们独立于游戏进行更新,并且我们维护跨游戏运行时的不同版本的向后兼容性。
在 Xbox 上,游戏运行时客户端和游戏运行时服务作为游戏操作系统的一部分交付,并且具有游戏操作系统的版本。 GameRuntime UI 应用与恢复和具有恢复的版本一起交付。 有关 Xbox 上的版本控制和游戏操作系统的详细信息,请参阅交付 Xbox 主机游戏。
交付 Windows 电脑程序
Microsoft 游戏开发工具包 (GDK) 提供游戏开发人员可以面向和链接的WINAPI_FAMILY_GAMES API 子集和保护库 (xgameplatform.lib), 以启动开发,并最大程度地跨电脑和 Xbox(例如,在中间件和库中)重用代码。 但是,我们不需要任何PC游戏来将自己限制为 Microsoft 游戏开发工具包 (GDK) API 外围应用。
电脑游戏开发者可以自由地继续使用电脑的全部功能;这包括所有的现有 Win32 API 和第三方扩展库,以及依赖于内核模式驱动程序的高级服务(如防欺骗)。 限制游戏和游戏开发人员可在电脑上执行的操作不是,也永远不会成为 Microsoft 游戏开发工具包 (GDK) 的目标。 换言之,我们希望您像往常一样继续开发、生成和交付 Win32 电脑游戏。
我们只是希望您可以更容易地利用您的 Win32 电脑游戏及其中间件和依赖项,通过使用 MSIXVC 打包它,以及在 Microsoft Store 中发布它。 有关使用 MSIXVC 打包您的游戏的详细信息,请参阅使用 MSIXVC 打包。 然后,如果你在 Microsoft Store 中交付电脑游戏,则不仅可以继续使用桌面 API 图面区域的整个功能,还可以通过集成对 Xbox 服务的支持,充分利用游戏运行时中的功能(例如,流式安装、连接存储以及对生成可访问游戏的支持)和 Xbox 社交网络的功能。
如果您确实决定使用游戏运行时的其他功能,请参阅窗口显示模式和游戏可调用的用户界面对话框,以了解对话框体验如何与您的游戏交互。
交付 Xbox 主机上的游戏
在 Xbox 上,游戏开发人员需要构建面向 Microsoft 游戏开发工具包 (GDK) WINAPI_FAMILY_GAMES API 子集的游戏版本。 就像现在Xbox One ERA 一样,你还需要面向 Direct3D 12 (D3D12.x) 的 Xbox 扩展以及 Xbox 音频和媒体扩展。
同样与当今Xbox One ERA 一样,Microsoft 游戏开发工具包 (GDK) 游戏在针对游戏优化的单独"游戏 OS"上运行,我们明确保证游戏可用的 GPU、CPU 和内存资源,如果你遵循我们的最佳做法指南,我们保证 I/O 性能率。
Microsoft 游戏开发工具包 (GDK) 的版本控制模型类似于 Xbox One ERA 模型:每个游戏都绑定到游戏操作系统的特定版本。
Microsoft 游戏开发工具包 (GDK) 游戏在 Xbox 主机的当前代系和子代中受支持。
重要说明:在 Xbox 上,Microsoft 游戏开发工具包 (GDK) 仅支持 D3D12.x
D3D11.x 不受支持。 如果你的游戏使用 D3D11.x,则在移动到 Microsoft 游戏开发工具包 (GDK) 时,需要移动到 D3D12.x。 在 Windows 电脑上,D3D11 和 D3D12 均受到支持。对于 Xbox One ERA 和 Microsoft 游戏开发工具包 (GDK),D3D12.x 仅存在细微差异。 这意味着,如果已有 D3D12.x 游戏,则所有图形代码都将转发到 Microsoft 游戏开发工具包 (GDK),而不会发生重大更改。 这也意味着准备 Microsoft 游戏开发工具包 (GDK) 的最佳方式是将Xbox One ERA 游戏移到 D3D12.x。
Microsoft 游戏开发工具包 (GDK) 异步模型
Microsoft 游戏开发工具包 (GDK) 实现异步 API 的新模式:一种解决我们收到的有关作为 Xbox One ERA 编程模型一部分实现的异步模式的游戏开发人员的反馈。 此新模式可以更加容易地集成到游戏中,并为您提供所需的高度控制。 它还包括对以下各项的支持:
- 使用完成回调函数(或 lambda)的异步
- 使用轮询以便确定异步调用何时完成的异步
- 在完成前针对某一异步调用进行阻止
- 控制异步工作何时执行以及在哪里执行
- 控制完成回调何时执行以及在哪里执行
下面介绍了一个使用回调的新异步模式的非常简单示例:
XAsyncBlock* b = new XAsyncBlock;
ZeroMemory(b, sizeof(XAsyncBlock));
b->context = this;
b->queue = queue;
b->callback = [](XAsyncBlock* async)
{
UpdateStatus status;
if (SUCCEEDED(QueryUpdateStatusAsyncResult(async, &status)))
{
printf("Update Status : %d\r\n", status);
}
delete async;
};
QueryUpdateStatusAsync("foo", b);
这是一个使用新异步模式生成阻止调用的同样简单的示例:
XAsyncBlock* b = new XAsyncBlock;
ZeroMemory(b, sizeof(XAsyncBlock));
if (SUCCEEDED(QueryUpdateStatusAsync("foo", b))) {
//Block until the call returns
if (SUCCEEDED(XAsyncGetStatus(b, true /*wait*/))) {
UpdateStatus status;
if (SUCCEEDED(QueryUpdateStatusAsyncResult(b, &status)))
{
printf("Update Status : %d\r\n", status);
}
}
}
delete b;
有关新异步模式的详细信息,请参阅:
Xbox 上的 Microsoft 游戏开发工具包 (GDK) 内存模型
当前Xbox One ERA 内存管理器满足游戏的性能需求 ,XMemAlloc要求授权 API 允许你跟踪和控制内存分配。 但是,我们想要做出改进,帮助您优化 Xbox 上您的游戏中的内存使用。
您的反馈指出,您遇到了与了解和预测代表游戏在游戏操作系统中执行的系统进程将使用多少内存有关的问题。 使用的内存量难以提前预测,并且会从版本更改为Xbox One软件开发工具包的版本。 最终结果是您不得不占用开发时间来对系统进程内存使用情况进行建模,并且您无法充分利用可在游戏操作系统中用于您的游戏的内存。
我们不仅解决了此问题,而且没有显著更改你熟悉的 Xbox One ERA 内存模型的许多部分 :XMemAlloc要求授权 和好友。 代表系统进程进行的内存分配现在隔离到一个单独的内存分区,该分区具有固定大小,并且不是提供给您的游戏的内存的一部分。
您现在可以准确预测可用于您的游戏的内存量,并且不必预留内存缓冲区以供系统进程使用就能够准确预测。 而这又将帮助您充分利用可在游戏操作系统中用于您的游戏的内存。
有关新内存模型的详细信息,请参阅内存概述要求授权。
通过使用 MSIXVC 打包
MSIXVC 是对我们以前为 Xbox 生成的打包系统的更新,以便它还可用于基于 Windows 10 的电脑游戏。 MSIXVC 包括当前所有支持的 Xbox 功能,如流式安装、智能交付和差异内容更新。 这意味着
- 对于 Xbox 游戏开发者,没有任何必需的变化并且技术和工具都是相同的。 继续做现在正在做的事情!
- 对于电脑游戏开发者,针对我们为 Xbox 生成的功能,我们在游戏运行时中增加了新功能,可使电脑游戏安装可再发行组件,例如 C 运行时、D3D 可再发行、自定义游戏启动程序、游戏编辑器工具和防欺骗软件。
在电脑上,利用现有 Win32 游戏并且通过使用 MSIXVC 打包它非常简单:
- 从合作伙伴中心获取产品标识。 请参阅发布 Windows 应用和游戏以开始。
- 创建一个 MicrosoftGame.config,然后将其放入您的游戏可执行文件的根文件夹。
- 标识游戏的 Visual C/C++ 运行时依赖项,如果有,则在 MicrosoftGame.config 中列出它们。
- 在 Microsoft 游戏开发工具包 (GDK) 中使用 makepkg 工具创建 MSIXVC 包。
- 使用 Microsoft 游戏开发工具包 (GDK) 中的 wdapp 工具在 Windows 19H1 电脑上部署和测试包。
- 将您的包提交到合作伙伴中心。
有关详细信息,请参阅 打包。
Microsoft 游戏开发工具包 (GDK) 开发人员工具
对于 Xbox 开发,我们支持与现今支持的完全相同的工具集,包括:
- xb* 远程管理命令行工具、Xbox 管理器、xbWatson要求授权 等
- Visual Studio 2019 和 Visual Studio 2022
- 用于 Xbox 的 PIX,用于对游戏进行性能优化
提高可靠性一直是我们的工作重心;特别是,我们关注游戏启动和速度的可靠性,以及 Visual Studio 中“F5”的可靠性。 我们还对 PIX 进行了重大的功能改进,包括了可对任意长时间段执行计时捕获的新功能。
对于电脑游戏开发,我们希望您将使用与现在所使用的完全相同的工具和技术:
我们将继续发布对用于 Windows 的 PIX 的改进,包括对长时间运行的计时捕获的改进。
我们仍将支持可变速率着色 (VRS)、硬件光线跟踪以及其他先进的 D3D12 功能。
但除此之外,我们正依赖于 Win32 游戏开发工具的充满活力的现有生态系统。