使用 Win32 和 UWP/Xbox 平台支持管理 C++ 应用程序的最佳实践?

Posted

技术标签:

【中文标题】使用 Win32 和 UWP/Xbox 平台支持管理 C++ 应用程序的最佳实践?【英文标题】:Best practices for managing C++ app with Win32 and UWP/Xbox platform support? 【发布时间】:2021-06-05 06:05:50 【问题描述】:

我正在开发一个项目,特别是一个游戏引擎,它支持 Windows 桌面 (Win32) 和通用 Windows (UWP/WinRT for Xbox One) 平台。虽然我很难管理它。对于 Visual Studio,WinRT 项目和标准 C++ 项目需要使用不同的项目类型进行编译。因此,对于我需要构建的每个项目,我需要有两个构建相同源代码的项目。例如,引擎需要使用两个不同的项目进行编译。一次,对于我想要运行的每个平台。这意味着每次我需要在每个平台上运行和测试它时,我都需要手动将启动项目设置为我想要启动的项目。我希望这是有道理的。

所以我的问题是:是否有任何工具、最佳实践或设计模式来处理这样的项目?理想情况下,我只想将配置更改为,比如 Xbox One,为 Xbox One 启动,或 Win32,为 Windows 桌面启动。但我愿意接受新的建议。

谢谢!

【问题讨论】:

对于 Windows,Microsoft 正在解决这些问题:docs.microsoft.com/en-us/windows/apps/project-reunion 请注意(在 Xbox 上不确定)您现在可以从标准 Win32 桌面应用程序中使用许多 WinRT API(那些标记为双重合同的)。也可以看看WinUI3(不是2):docs.microsoft.com/en-us/windows/apps/winui/winui3 【参考方案1】:

我有许多为“经典”Win32 桌面、Windows 10 桌面、UWP 和 Xbox 构建的 C++ 库。大部分代码是 Win32 C++ 或 DirectX。对于游戏、音频和渲染,这些平台的重叠非常明显,这正是我关注的地方。

https://github.com/microsoft/DirectXTK/ https://github.com/microsoft/DirectXTK12/ https://github.com/microsoft/DirectXTex/ https://github.com/microsoft/DirectXMesh/

我有一个博客系列,其中包含了我使用的大部分“最佳实践”,您可能希望参考:Dual-use Coding Techniques for Games。

在某些情况下,我需要与 Windows 运行时 API 进行交互。在某些情况下,我使用由__cplusplus_winrt 保护的C++/CX 扩展。在某些情况下,我通过低级 ABI 使用 WRL(坦率地说,这很丑陋,但我不需要做那么多)。 C++/CX 仅受 Microsoft Visual C++ 支持,因此 WRL 或更好的 C++/WinRT 是新项目的更好选择。

具体的例子是:

游戏手柄 - https://github.com/microsoft/DirectXTK/blob/master/Src/GamePad.cpp

键盘 - https://github.com/microsoft/DirectXTK/blob/master/Src/Keyboard.cpp

鼠标 - https://github.com/microsoft/DirectXTK/blob/master/Src/Mouse.cpp

XAudio2 设备枚举 - https://github.com/microsoft/DirectXTK/blob/master/Audio/AudioEngine.cpp

所有多平台引擎都将诸如“窗口管理、表示循环和交换链”之类的东西隔离开来。对于 Microsoft 平台,我在GitHub 上的 VS 模板中捕获了这些内容。

每个平台也有自己的实现方式,例如基于云的存储、存储/许可 API、多人游戏匹配/连接等,因此如果您实现它们,您也需要隔离它们。

说了这么多,您应该考虑一下您对这个项目的目标是什么。如果您想创建游戏,请使用现成的东西,例如 UnrealEngine 或 Unity。如果您想了解有关 Direct3D、音频等图形和游戏技术的更多信息,那么小型引擎是个好主意,但您应该真正将目标平台范围缩小到一些简单的东西。编写“多平台”引擎是一项艰巨的任务,因此坚持一个开始通常是更好的选择。

【讨论】:

这些资源很棒,谢谢!那么你真的会建议按照我现在的方式设置项目吗?有两个不同的项目会在两次不同的时间编译源代码?显然是两个不同的可执行文件,但从工作流的角度来看,这有点笨拙:一个 App_UWP.vcxproj 和一个 App_Win32.vcxproj 以及一个 Engine_UWP.vcxproj 和 Engine_Win32.vcxproj。 如果可能的话,您可能希望使该引擎项目“共享”,以便它只构建一次代码,然后隔离这些项目中的所有 UWP 与 Win32 事物。当然,您始终可以在每个平台 vcprojs 中构建相同的“共享”源文件。我一直维护并行项目,只是因为在其他方面做得好需要弄乱自定义道具,但这在技术上也是可行的。 这就是我现在的组织方式。引擎源代码位于共享项目项目 (.vcxitems) 中,然后Engine_* 根据每个平台的要求构建这些文件。这就是你所说的共享的意思吗?

以上是关于使用 Win32 和 UWP/Xbox 平台支持管理 C++ 应用程序的最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

UWP - Xbox One - JavaScript - 禁用 gamepadB 默认后退导航行为

在vs 2012中运行fortran语言时出现提示Debug win 32需要win 32平台支持编译,是啥情况?

用于 Win32 平台的 CMake find_package(PythonInterp 3.7 REQUIRED)

libusb-win32 支持win10吗

win32 zbar

二.hadoop环境搭建