Skip to main content
本演练完整介绍了从创建一个小型 sample-game 游戏,到为 XBOX Series X|S 主机构建、将完整游戏部署到 XBOX 开发套件、诊断启动失败,直至创建可安装 XVC 的全流程。 完成的示例使用 C++、Direct3D 12,以及带有 XBOX 扩展的 GDK (GDKX)。它还使用 DirectXTK12 作为可选的渲染辅助库。两个球拍均由计算机控制,因此游戏可以在你迭代图形、玩法与特效时无人值守地持续运行。
通过 GitHub 或 WinGet 提供的公开 GDK 仅支持 Windows PC 游戏开发。若要编译和部署 XBOX 主机可执行程序,必须从 XBOX Secure Downloads 安装带有 XBOX 扩展的 GDK (GDKX)。访问该资源需要已获批准的 XBOX 开发者账户。请参阅 ID@XBOX 加入流程以及访问 GDK 资源与下载

你将构建的内容

完成本演练后,你将获得:
  • 一个原生的 XBOX GDK 项目(不是 UWP 项目)。
  • 面向 XBOX Series X|S 主机与 XBOX One 系列主机的 Debug、Profile 与 Release 配置。
  • 一款带计分、预测式球拍 AI、粒子特效、运动尾迹与带贴图圆形冰球的自动演示示例游戏。
  • 在 XBOX 开发套件上运行的完整松散文件部署。
  • 可在开发套件上安装并测试的、可选的与 Store 关联的 XVC。

开始之前

本演练在以下环境中验证:
  • Visual Studio 2022 Enterprise 17.14。
  • 2026 年 4 月 Update 2 GDKX,版本号 260402
  • 面向 XBOX Series X|S 主机的 Gaming.XBOX.Scarlett.x64
  • 面向 XBOX One 系列主机的 Gaming.XBOX.XboxOne.x64
  • DirectXTK12 提交 e656d54637b2830fc6eb5ecd9b329a9c72cb87d4
如果你使用其他版本跟随本演练,请以你开发 PC 上已安装的 GDK 版本代替 260402

第 1 步:创建工作目录

打开 PowerShell,创建一个空的根目录。
本演练最终使用的项目布局如下:
Visual Studio 会根据 Direct3D 12 XBOX Game 模板创建 DeviceResources.*Main.cpppch.*StepTimer.h 以及外壳视觉 PNG 文件。在添加示例特有代码时,请保留这些自动生成的文件。

第 2 步:验证 XBOX GDK 安装

打开随 GDKX 一同安装的 XBOX Series X|S VS 2022 Gaming Command Prompt。该快捷方式通常位于开始菜单的 Microsoft GDK 下。 你也可以从普通命令提示符初始化该环境:
验证 XBOX 构建与部署工具是否可用:
若出现以下情况,则 GDK 安装尚未准备好进行主机开发:
  • GXDKEDITION 为空。
  • 缺少 XBOX 命令提示符的快捷方式。
  • Visual Studio 未显示 XBOX 项目模板。
  • 无法使用 Gaming.XBOX.Scarlett.x64 MSBuild 平台。
  • 找不到 xbconnectxbapp
如果只能看到 Desktop GDK 的命令提示符和 Desktop 模板,那么很可能安装的是公开 PC GDK,而不是 GDKX。

第 3 步:创建原生 XBOX 项目

1

打开 Visual Studio 2022 并选择 Create a new project

Language 设置为 C++Platform 设置为 XBOXProject type 设置为 Games
2

选择 Direct3D 12 XBOX Game

将项目名称设为 sample-game,位置设为 D:\repos\sample-game
3

不要勾选 Place solution and project in the same directory

这样解决方案位于根目录,项目位于 D:\repos\sample-game\sample-game
4

创建项目

推荐的工作流是通过 Visual Studio 创建项目。手动复制 d3d12game_gx 模板文件是一种恢复手段,而不是推荐的新建项目流程。

确认项目不是 UWP

在添加游戏代码之前,请核实项目:
  • 包含 MicrosoftGameConfig.mgc
  • 使用 Gaming.XBOX.*.x64 项目平台。
  • 链接 XBOX GDK 平台库。
  • 不使用 Package.appxmanifest 作为游戏配置。
  • 创建自 Direct3D 12 XBOX Game 模板,而不是通用 Windows 模板。
如果项目是 UWP,请删除并从 XBOX GDK 模板重新创建。将自动生成的 UWP 项目转换过来比使用正确的模板开始更容易出错。

第 4 步:锁定 GDK 版本并配置主机目标

锁定 GDK 版本可以防止未来某次 GDK 安装悄悄改变项目使用的工具链。 sample-game.vcxproj 的主属性组中设置:
使用 Visual Studio 配置管理器确认以下解决方案配置: 如果游戏只支持 XBOX Series X|S 主机,可以省略 XBOX One 系列主机的配置。跨世代发布同一游戏,请参阅跨世代

第 5 步:构建未修改的模板

在添加依赖项或游戏代码之前先构建生成的模板。这样能将工具链问题与示例引入的问题隔离开来。 XBOX Series X|S VS 2022 Gaming Command Prompt 中执行:
对于 XBOX One 系列主机,初始化 XBOX One 命令行环境并构建 XBOX One 平台:
在原始 XBOX 模板成功构建之前,请勿继续下一步。

第 6 步:将 DirectXTK12 作为可选辅助库添加

DirectXTK12 并非创建 GDK 游戏的必需项。XBOX GDK 模板已经提供了直接基于 Direct3D 12 构建游戏所需的 D3D12 设备、命令队列、交换链与游戏循环。 本示例使用另外的 Microsoft 开源 DirectXTK12 库,以减少精灵渲染、描述符管理、纹理加载、资源上传与显存管理所需的底层渲染辅助代码量。游戏也可以用自己的引擎或直接的 D3D12 实现来替代这些辅助功能。 将 DirectXTK12 克隆到项目中:
在 Visual Studio 中:
  1. external\DirectXTK12\DirectXTK_GDKX_2022.vcxproj 添加到解决方案。
  2. sample-game 添加对 DirectXTK12 的项目引用。
  3. $(SolutionDir)external\DirectXTK12\Inc 添加到包含目录。
  4. 使用相同的 XBOX 平台与配置构建这两个项目。
sample-game 项目使用以下属性:
然后添加包含路径与项目引用:
在本项目中,DirectXTK12 的着色器构建命令被修改为通过显式的项目相对路径调用 CompileShaders.cmd:
这样可以避免 MSBuild 调用着色器编译器时依赖当前命令目录。

第 7 步:添加游戏代码

示例将玩法状态与渲染分离,这样调整仿真时无需修改 Direct3D 代码。 保留模板生成的文件,包括 DeviceResources.*Main.cpppch.*StepTimer.h 以及五个外壳视觉 PNG 文件。将下列示例特有文件添加到项目中:

使用固定的仿真步长

项目使用模板自带的 StepTimer,以 120 Hz 固定更新运行。固定步长可在帧时波动时保持碰撞响应与 AI 行为稳定。 仿真包含:
  • 两个球拍状态。
  • 一个圆形冰球状态。
  • 左右两侧的比分。
  • 发球延迟与交替的发球方向。
  • 用于球拍、墙壁与球门碰撞的撞击事件。

实现圆形冰球碰撞

将每个球拍视为轴对齐矩形,将冰球视为圆:
  1. 找到球拍矩形上距离冰球中心最近的点。
  2. 计算该点到冰球中心的距离平方。
  3. 若距离不大于冰球半径的平方,则发生碰撞。
  4. 将冰球移出球拍范围以避免反复重叠。
  5. 根据撞击偏移与球拍速度计算出射角度。
  6. 略微增加冰球速度,直至上限。
即便冰球是用正方形纹理绘制的,这种方式也能保持物理表现为圆形。

添加预测式自动操作

每个球拍会:
  • 预测冰球何时抵达其水平位置。
  • 将预测坐标在场地上下墙之间反射。
  • 以固定的反应间隔更新目标。
  • 使用加速度与最高速度限制,而不是瞬移。
  • 加入一个小的确定性瞄准误差。
为了让比赛能够得分,每一侧偶尔会进入短暂的”失误窗口”,故意偏离预测的拦截点。让两侧的初始失误计时器错开,以免同时失误。

使用 DirectXTK12 渲染场景

创建:
  • GraphicsMemory
  • 一个包含白色纹理和冰球纹理的描述符堆。
  • 一个正常 Alpha 混合的 SpriteBatch
  • 一个用于粒子的加性混合 SpriteBatch
  • 通过 ResourceUploadBatchCreateDDSTextureFromFile 加载的 DDS 纹理。
使用 SpriteBatch 绘制场地、中线、球拍、比分、冰球尾迹与冰球。在加性通道中绘制粒子。 完成后的示例在 1920 × 1080 的虚拟坐标系中渲染,并将该场景缩放至输出视口。

保持特效克制

最终调整参数为:
  • 短暂、指数衰减的画面震动。
  • 更小的条状撞击粒子。
  • 球拍撞击时的粒子数多于墙壁撞击。
  • 进球时爆发更强。
  • 低透明度的冰球尾迹。
  • 短暂的绿色撞击闪光。
这些调整保留了撞击反馈,同时避免让游戏显得卡通化,或让球拍碰撞在视觉上过于突兀。

第 8 步:创建并部署纹理资源

示例需要:
  • Assets\white.dds:一张 1×1 的白色 RGBA 纹理,用于绘制矩形与粒子。
  • Assets\xbox_logo.dds:一张 256×256 的 RGBA 纹理,用于冰球。
资源脚本会:
  1. 加载源 logo。
  2. 缩放为 256×256。
  3. 应用羽化圆形 Alpha 遮罩。
  4. 写出带 DX10 头的 RGBA8 DDS。
  5. 创建 1×1 白色 DDS。
在 PowerShell 中运行:
sample-game.vcxproj 中将两个 DDS 文件注册为部署内容:
使用标准头加 DX10 扩展的 DDS 文件在像素数据之前有 148 字节。在最初调试过程中,一个自定义 DDS 写入器输出了 152 字节,导致游戏在加载纹理时失败并返回 0x8007000D。如果你使用自定义 DDS 写入器,请在部署前验证头部布局。

第 9 步:构建游戏

在 XBOX Series X|S VS 2022 Gaming Command Prompt 中:
松散构建输出目录为:
确认输出中包含:
  • sample-game.exe
  • MicrosoftGame.config
  • 外壳视觉 PNG 文件
  • Assets\white.dds
  • Assets\xbox_logo.dds
  • 所需的运行时 DLL
  • 构建生成的 Game OS 镜像或其他部署元数据
项目源文件名为 MicrosoftGameConfig.mgc。GDK 的 MGCCompile 构建项会对其进行校验,并在构建输出中生成 MicrosoftGame.config。部署与打包都使用生成的 .config 文件。请参阅游戏配置

第 10 步:连接到 XBOX 开发套件

使用开发套件的 Tools IP 地址或主机名将其设为默认主机:
查看已保存的主机:
运行连接诊断:
如果游戏使用 Partner Center 沙盒,请配置区分大小写的沙盒 ID 并重启主机:
显示当前沙盒:

第 11 步:部署完整的游戏

部署整个构建输出目录:
不要只复制 sample-game.exe。游戏还需要 MicrosoftGame.config、资源、运行时依赖、外壳图像与部署元数据。仅复制可执行文件不是有效的完整部署。
在更改资源或配置后进行干净的重新部署:
部署完成后使用 xbapp list 查找已注册的 package full name 与应用用户模型 ID (AUMID)。AUMID 以 !Game 结尾。

第 12 步:启动并验证游戏

启动 xbapp list 显示的完整 AUMID:
等待游戏进程:
验证包正在运行:
预期结果:
此时,自动演示的比赛应当已经显示在开发套件上。

第 13 步:诊断即时启动失败

如果游戏立即退出,不要仅因为可执行文件被复制就认为部署已经成功。

获取上一次游戏结果

监视调试输出

在一个命令提示符窗口中启动调试输出监视器:
在另一个窗口启动游戏:
示例在以下位置添加了 OutputDebugStringA 消息:
  • 游戏初始化。
  • DirectXTK12 资源创建。
  • 每次纹理加载。
  • 精灵管线创建。
  • 纹理上传完成。
  • 帧异常。
在最初的调试过程中,启动失败被定位到加载 white.dds。加载器返回 0x8007000D,表明 DDS 数据格式错误。修正 DDS 头并进行一次干净的完整部署后,启动恢复正常。 如需更多启动诊断,请在复现失败时运行 xbWatson。另请参阅错误处理

第 14 步:安全地迭代

对于大多数纯代码更改:
  1. 构建 Debug。
  2. 终止正在运行的包。
  3. 部署完整的输出目录。
  4. 启动已注册的 AUMID。
  5. 查询包状态。
对于 MicrosoftGameConfig.mgc、资源或部署元数据的更改,在再次部署前先卸载旧的松散部署。这可防止陈旧文件或注册数据掩盖修复。

可选:创建并测试 XVC

松散部署是最快的开发循环。当你需要测试类似零售的安装流程或为 Partner Center 准备包时再创建 XVC。完整的打包参考请参阅打包

将 MicrosoftGame.config 与 Partner Center 关联

从产品的 Game setup > Identity details 获取以下值:
  • Package Identity Name。
  • Package Identity Publisher。
  • Publisher Display Name。
  • Store ID。
  • XBOX Title ID。
  • MSA App ID。
在源代码控制的示例中使用占位符。不要复制其他产品的身份信息。 对于 XBOX Series X|S 主机,重要结构如下:
XBOX Series X|S 主机的包必须使用 TargetDeviceFamily="Scarlett"。XBOX One 系列主机的包请使用单独的配置。

构建 Release 配置

暂存包内容

将 Release 输出复制到暂存目录,但要将 gameos.xvd 排除在内容映射之外,并且不要将 PDB 文件作为普通包内容包含。

生成布局

对这个小型示例来说,生成的布局包含一个启动分块:

创建开发套件测试包

默认的测试加密方式适用于本地开发套件安装:
MicrosoftGame.config 中存在 StoreId 时,常规 Store 提交不需要 /productid。除非有明确记录的离线或光盘场景要求,否则请省略它。

为 Partner Center 包使用提交加密

sample-game 包最初使用开发套件测试加密生成,以便验证安装与启动。对于将要提交的包,请遵循当前的打包策略,使用 /lk/l 推荐的可复现 /lk 工作流为:
妥善保管 LEKB。不要将其提交到源代码管理。

安装并启动 XVC

测试完成后终止该包:

常见问题与修复

参见

最后修改于 2026年8月24日