本主题介绍 Visual Studio 中提供的 Windows 电脑游戏项目模板。
项目模板
Microsoft 游戏开发工具包 (GDK) 安装以下 Visual Studio C++ 项目模板。
Direct3D 12 桌面游戏(经典): Windows 游戏的项目,使用 Direct3D 12 和 C++ 以及“标准”x64 MSBuild 平台。
Direct3D 12 桌面游戏: Windows 游戏的项目,使用 Direct3D 12 和 C++ 和 Gaming.Desktop.x64 MSBuild 自定义平台。
Direct3D 12 桌面游戏生成文件:一个使用 Direct3D 12 和 C++ 的 Windows 游戏项目,使用外部生成系统。
桌面静态库: 具有 Gaming.Desktop.x64 MSBuild 自定义平台的 Windows 静态库的项目。
桌面 DLL: 具有 Gaming.Desktop.x64 MSBuild 自定义平台的 Windows 动态链接库的项目。
查找 Microsoft 游戏开发工具包 (GDK) 项目模板
通过在 Visual Studio 2019 或 Visual Studio 2022 的 创建新项目 对话框中搜索和筛选,找到 Microsoft 游戏开发工具包 (GDK) 模板。 通过筛选到 C++ 语言、Windows 平台和游戏项目类型可找到 Microsoft 游戏开发工具包 (GDK) 模板,如以下屏幕截图所示。
Gaming.Desktop.x64 平台、msbuild 文件和属性
Microsoft 游戏开发工具包 (GDK) 定义了一个名为 Gaming.Desktop.x64 的 msbuild 平台,用于 Windows 电脑游戏开发。 Gaming.Desktop.x64 包括一组 msbuild 属性和目标文件,它们定义所需的预处理器指令(例如 _GAMING_DESKTOP
),并设置路径,使构建游戏时,可在 C:\Program Files (x86)\Microsoft GDK\edition\GRDK 下正确找到扩展库、include 文件和库等内容。 有关 Gaming.Desktop.x64 平台定义的 msbuild 属性和目标的具体详细信息,请参阅在不安装 Microsoft 游戏开发工具包的情况下配置项目。
将 x64 平台与 Microsoft 游戏开发工具包 (GDK) 配合使用
在不使用自定义 Gaming.Desktop.x64 MSBuild 平台的情况下面向电脑时,项目文件必须实现所有必需的功能。
- 若要支持“并行”安装,项目必须选择适当的版本。 这可以通过 Globals 部分中的属性集来实现:
<PropertyGroup Label="Globals">
...
<GDKPCEditionPath>$(GRDKLatest)</GDKPCEditionPath>
</PropertyGroup>
使用的 GRDKLatest
环境变量默认为开发电脑上安装的最新版本,格式为 C:\Program Files (x86)\Microsoft GDK<版本>\GRDK\。
我们在生成设置的其余部分中使用 GDKPCEditionPath 属性。 不建议在项目文件的其余部分直接使用
GRDKLatest
作为属性,因为这会使尝试新版本、管理更新、重现问题等变得更加困难。如果使用自定义 .props 文件来驱动生成过程,请将GDKPCEditionPath
放在该文件中,而不是放在每个项目文件中。 另请注意,此属性需要尾部斜杠来满足 MSBuild 约定。
对于 VS 2019,还必须确保使用 x64 本机版本的工具。 对于 VS 2022,这是默认值,因此它是可选的。
<PropertyGroup Label="Globals">
...
<PreferredToolArchitecture>x64</PreferredToolArchitecture>
</PropertyGroup>
- 任何必需的 Microsoft 游戏开发工具包 (GDK) 扩展库都必须根据需要包含相应的包含/库路径和重新分发 DLL。 这可以通过修改 vcxproj 文件 ExtensionSettings 导入来实现:
Microsoft GDK (2024 年 10 月) 或更高版本:
<ImportGroup Label="ExtensionSettings">
<Import Project="$(GDKPCEditionPath)ExtensionLibraries\Xbox.Services.API.C\ExtensionLibrary.props" />
<Import Project="$(GDKPCEditionPath)ExtensionLibraries\Xbox.XCurl.API\ExtensionLibrary.props" />
<Import Project="$(GDKPCEditionPath)ExtensionLibraries\Xbox.LibHttpClient\ExtensionLibrary.props" />
<Import Project="$(GDKPCEditionPath)ExtensionLibraries\Xbox.Game.Chat.2.Cpp.API\ExtensionLibrary.props" />
<Import Project="$(GDKPCEditionPath)ExtensionLibraries\PlayFab.Multiplayer.Cpp\ExtensionLibrary.props" />
<Import Project="$(GDKPCEditionPath)ExtensionLibraries\PlayFab.Party.Cpp\ExtensionLibrary.props" />
<Import Project="$(GDKPCEditionPath)ExtensionLibraries\PlayFab.PartyXboxLive.Cpp\ExtensionLibrary.props" />
</ImportGroup>
Microsoft GDK (2024 年 6 月) 或更早:
<ImportGroup Label="ExtensionSettings">
<Import Project="$(GDKPCEditionPath)ExtensionLibraries\Xbox.Services.API.C\DesignTime\CommonConfiguration\Neutral\ExtensionLibrary.props" />
<Import Project="$(GDKPCEditionPath)ExtensionLibraries\Xbox.XCurl.API\DesignTime\CommonConfiguration\Neutral\ExtensionLibrary.props" />
<Import Project="$(GDKPCEditionPath)ExtensionLibraries\Xbox.LibHttpClient\DesignTime\CommonConfiguration\Neutral\ExtensionLibrary.props" />
<Import Project="$(GDKPCEditionPath)ExtensionLibraries\Xbox.Game.Chat.2.Cpp.API\DesignTime\CommonConfiguration\Neutral\ExtensionLibrary.props" />
<Import Project="$(GDKPCEditionPath)ExtensionLibraries\PlayFab.Multiplayer.Cpp\DesignTime\CommonConfiguration\Neutral\ExtensionLibrary.props" />
<Import Project="$(GDKPCEditionPath)ExtensionLibraries\PlayFab.Party.Cpp\DesignTime\CommonConfiguration\Neutral\ExtensionLibrary.props" />
<Import Project="$(GDKPCEditionPath)ExtensionLibraries\PlayFab.PartyXboxLive.Cpp\DesignTime\CommonConfiguration\Neutral\ExtensionLibrary.props" />
</ImportGroup>
- 应更新 VC++ 目录属性 ExecutablePath、IncludePath 和 LibraryPath,以包括 Microsoft 游戏开发工具包 (GDK) 路径。
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ExecutablePath>$(GameDK)bin;$(ExecutablePath)</ExecutablePath>
<IncludePath>$(GDKPCEditionPath)GameKit\Include;$(Console_SdkIncludeRoot);$(IncludePath);</IncludePath>
<LibraryPath>$(GDKPCEditionPath)GameKit\lib\amd64;$(Console_SdkLibPath);$(LibraryPath)</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ExecutablePath>$(GameDK)bin;$(ExecutablePath)</ExecutablePath>
<IncludePath>$(GDKPCEditionPath)GameKit\Include;$(Console_SdkIncludeRoot);$(IncludePath);</IncludePath>
<LibraryPath>$(GDKPCEditionPath)GameKit\lib\amd64;$(Console_SdkLibPath);$(LibraryPath)</LibraryPath>
</PropertyGroup>
对于可执行路径,我们直接使用 GameDK
环境变量,因为这不是“并行”。 如果需要,也可以将其重写为自定义 .props 文件中的属性。
Console_SdkIncludeRoot 和 Console_SdkLibPath 属性是由 Microsoft 游戏开发工具包 (GDK) ExtensionLibrary.props 提供的,它兼容 x64 电脑和 Xbox。
- 对于平台 ItemDefinitionGroups,请务必将
_GAMING_DESKTOP
添加到预处理器定义,以便在使用库或其他中间件时与 Gaming.Desktop.x64 保持一致。
<PreprocessorDefinitions>_GAMING_DESKTOP;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>_GAMING_DESKTOP;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- 此外,在 ItemDefinitionGroups 中,将以下库添加到其他库依赖项。 专门针对电脑上的
xgameruntime.lib
的 GameRuntime 和gameinput.lib
的 GameInput。
<AdditionalDependencies>xgameruntime.lib;gameinput.lib;d3d12.lib;dxgi.lib;dxguid.lib;uuid.lib;kernel32.lib;user32.lib;%(AdditionalDependencies)</AdditionalDependencies>
- 最后一个必需元素是在生成输出中将源 MicrosoftGameConfig.mgc 文件转换为所需的 MicrosoftGame.config。 这可以作为生成自定义实现:
<CustomBuild Include="MicrosoftGameConfig.mgc">
<Command>copy %(Identity) "$(OutDir)MicrosoftGame.config"
makepkg.exe localize /d "$(OutDir)" /pd "$(OutDir)" /gc "%(Identity)"</Command>
<Message>MGC Compile</Message>
<Outputs>$(OutDir)MicrosoftGame.config</Outputs>
</CustomBuild>
MicrosoftGame.config 还需要所需的徽标资产才能有效,这可以通过复制文件来实现:
<ItemGroup>
<CopyFileToFolders Include="GraphicsLogo.png" />
<CopyFileToFolders Include="LargeLogo.png" />
<CopyFileToFolders Include="SmallLogo.png" />
<CopyFileToFolders Include="SplashScreen.png" />
<CopyFileToFolders Include="StoreLogo.png" />
</ItemGroup>
从 Direct3D 12 桌面游戏(经典) 模板创建项目,并查看上述设置以及一些其他建议。