sample-game 游戏,到为 XBOX Series X|S 主机构建、将完整游戏部署到 XBOX 开发套件、诊断启动失败,直至创建可安装 XVC 的全流程。
完成的示例使用 C++、Direct3D 12,以及带有 XBOX 扩展的 GDK (GDKX)。它还使用 DirectXTK12 作为可选的渲染辅助库。两个球拍均由计算机控制,因此游戏可以在你迭代图形、玩法与特效时无人值守地持续运行。
你将构建的内容
完成本演练后,你将获得:- 一个原生的 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。
260402。
第 1 步:创建工作目录
打开 PowerShell,创建一个空的根目录。DeviceResources.*、Main.cpp、pch.*、StepTimer.h 以及外壳视觉 PNG 文件。在添加示例特有代码时,请保留这些自动生成的文件。
第 2 步:验证 XBOX GDK 安装
打开随 GDKX 一同安装的 XBOX Series X|S VS 2022 Gaming Command Prompt。该快捷方式通常位于开始菜单的 Microsoft GDK 下。 你也可以从普通命令提示符初始化该环境:GXDKEDITION为空。- 缺少 XBOX 命令提示符的快捷方式。
- Visual Studio 未显示 XBOX 项目模板。
- 无法使用
Gaming.XBOX.Scarlett.x64MSBuild 平台。 - 找不到
xbconnect或xbapp。
第 3 步:创建原生 XBOX 项目
1
打开 Visual Studio 2022 并选择 Create a new project
将 Language 设置为 C++、Platform 设置为 XBOX、Project 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
创建项目
d3d12game_gx 模板文件是一种恢复手段,而不是推荐的新建项目流程。
确认项目不是 UWP
在添加游戏代码之前,请核实项目:- 包含
MicrosoftGameConfig.mgc。 - 使用
Gaming.XBOX.*.x64项目平台。 - 链接 XBOX GDK 平台库。
- 不使用
Package.appxmanifest作为游戏配置。 - 创建自 Direct3D 12 XBOX Game 模板,而不是通用 Windows 模板。
第 4 步:锁定 GDK 版本并配置主机目标
锁定 GDK 版本可以防止未来某次 GDK 安装悄悄改变项目使用的工具链。 在sample-game.vcxproj 的主属性组中设置:
如果游戏只支持 XBOX Series X|S 主机,可以省略 XBOX One 系列主机的配置。跨世代发布同一游戏,请参阅跨世代。
第 5 步:构建未修改的模板
在添加依赖项或游戏代码之前先构建生成的模板。这样能将工具链问题与示例引入的问题隔离开来。 在 XBOX Series X|S VS 2022 Gaming Command Prompt 中执行:第 6 步:将 DirectXTK12 作为可选辅助库添加
DirectXTK12 并非创建 GDK 游戏的必需项。XBOX GDK 模板已经提供了直接基于 Direct3D 12 构建游戏所需的 D3D12 设备、命令队列、交换链与游戏循环。 本示例使用另外的 Microsoft 开源 DirectXTK12 库,以减少精灵渲染、描述符管理、纹理加载、资源上传与显存管理所需的底层渲染辅助代码量。游戏也可以用自己的引擎或直接的 D3D12 实现来替代这些辅助功能。 将 DirectXTK12 克隆到项目中:- 将
external\DirectXTK12\DirectXTK_GDKX_2022.vcxproj添加到解决方案。 - 从
sample-game添加对 DirectXTK12 的项目引用。 - 将
$(SolutionDir)external\DirectXTK12\Inc添加到包含目录。 - 使用相同的 XBOX 平台与配置构建这两个项目。
sample-game 项目使用以下属性:
CompileShaders.cmd:
第 7 步:添加游戏代码
示例将玩法状态与渲染分离,这样调整仿真时无需修改 Direct3D 代码。 保留模板生成的文件,包括DeviceResources.*、Main.cpp、pch.*、StepTimer.h 以及五个外壳视觉 PNG 文件。将下列示例特有文件添加到项目中:
使用固定的仿真步长
项目使用模板自带的StepTimer,以 120 Hz 固定更新运行。固定步长可在帧时波动时保持碰撞响应与 AI 行为稳定。
仿真包含:
- 两个球拍状态。
- 一个圆形冰球状态。
- 左右两侧的比分。
- 发球延迟与交替的发球方向。
- 用于球拍、墙壁与球门碰撞的撞击事件。
实现圆形冰球碰撞
将每个球拍视为轴对齐矩形,将冰球视为圆:- 找到球拍矩形上距离冰球中心最近的点。
- 计算该点到冰球中心的距离平方。
- 若距离不大于冰球半径的平方,则发生碰撞。
- 将冰球移出球拍范围以避免反复重叠。
- 根据撞击偏移与球拍速度计算出射角度。
- 略微增加冰球速度,直至上限。
添加预测式自动操作
每个球拍会:- 预测冰球何时抵达其水平位置。
- 将预测坐标在场地上下墙之间反射。
- 以固定的反应间隔更新目标。
- 使用加速度与最高速度限制,而不是瞬移。
- 加入一个小的确定性瞄准误差。
使用 DirectXTK12 渲染场景
创建:GraphicsMemory。- 一个包含白色纹理和冰球纹理的描述符堆。
- 一个正常 Alpha 混合的
SpriteBatch。 - 一个用于粒子的加性混合
SpriteBatch。 - 通过
ResourceUploadBatch与CreateDDSTextureFromFile加载的 DDS 纹理。
SpriteBatch 绘制场地、中线、球拍、比分、冰球尾迹与冰球。在加性通道中绘制粒子。
完成后的示例在 1920 × 1080 的虚拟坐标系中渲染,并将该场景缩放至输出视口。
保持特效克制
最终调整参数为:- 短暂、指数衰减的画面震动。
- 更小的条状撞击粒子。
- 球拍撞击时的粒子数多于墙壁撞击。
- 进球时爆发更强。
- 低透明度的冰球尾迹。
- 短暂的绿色撞击闪光。
第 8 步:创建并部署纹理资源
示例需要:Assets\white.dds:一张 1×1 的白色 RGBA 纹理,用于绘制矩形与粒子。Assets\xbox_logo.dds:一张 256×256 的 RGBA 纹理,用于冰球。
- 加载源 logo。
- 缩放为 256×256。
- 应用羽化圆形 Alpha 遮罩。
- 写出带 DX10 头的 RGBA8 DDS。
- 创建 1×1 白色 DDS。
sample-game.vcxproj 中将两个 DDS 文件注册为部署内容:
使用标准头加 DX10 扩展的 DDS 文件在像素数据之前有 148 字节。在最初调试过程中,一个自定义 DDS 写入器输出了 152 字节,导致游戏在加载纹理时失败并返回
0x8007000D。如果你使用自定义 DDS 写入器,请在部署前验证头部布局。第 9 步:构建游戏
在 XBOX Series X|S VS 2022 Gaming Command Prompt 中:sample-game.exeMicrosoftGame.config- 外壳视觉 PNG 文件
Assets\white.ddsAssets\xbox_logo.dds- 所需的运行时 DLL
- 构建生成的 Game OS 镜像或其他部署元数据
MicrosoftGameConfig.mgc。GDK 的 MGCCompile 构建项会对其进行校验,并在构建输出中生成 MicrosoftGame.config。部署与打包都使用生成的 .config 文件。请参阅游戏配置。
第 10 步:连接到 XBOX 开发套件
使用开发套件的 Tools IP 地址或主机名将其设为默认主机:第 11 步:部署完整的游戏
部署整个构建输出目录:xbapp list 查找已注册的 package full name 与应用用户模型 ID (AUMID)。AUMID 以 !Game 结尾。
第 12 步:启动并验证游戏
启动xbapp list 显示的完整 AUMID:
第 13 步:诊断即时启动失败
如果游戏立即退出,不要仅因为可执行文件被复制就认为部署已经成功。获取上一次游戏结果
监视调试输出
在一个命令提示符窗口中启动调试输出监视器:OutputDebugStringA 消息:
- 游戏初始化。
- DirectXTK12 资源创建。
- 每次纹理加载。
- 精灵管线创建。
- 纹理上传完成。
- 帧异常。
white.dds。加载器返回 0x8007000D,表明 DDS 数据格式错误。修正 DDS 头并进行一次干净的完整部署后,启动恢复正常。
如需更多启动诊断,请在复现失败时运行 xbWatson。另请参阅错误处理。
第 14 步:安全地迭代
对于大多数纯代码更改:- 构建 Debug。
- 终止正在运行的包。
- 部署完整的输出目录。
- 启动已注册的 AUMID。
- 查询包状态。
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。
TargetDeviceFamily="Scarlett"。XBOX One 系列主机的包请使用单独的配置。
构建 Release 配置
暂存包内容
将 Release 输出复制到暂存目录,但要将gameos.xvd 排除在内容映射之外,并且不要将 PDB 文件作为普通包内容包含。
生成布局
创建开发套件测试包
默认的测试加密方式适用于本地开发套件安装:为 Partner Center 包使用提交加密
sample-game 包最初使用开发套件测试加密生成,以便验证安装与启动。对于将要提交的包,请遵循当前的打包策略,使用/lk 或 /l。
推荐的可复现 /lk 工作流为:
