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

C++ 管理C+的最佳实践+;支持Win32和UWP/Xbox平台的应用程序?,c++,visual-studio,windows-runtime,game-engine,xbox-one,C++,Visual Studio,Windows Runtime,Game Engine,Xbox One,我正在做一个项目,特别是一个游戏引擎,它支持Windows桌面(Win32)和通用Windows(Xbox One的UWP/WinRT)平台。尽管我在管理上有困难。对于VisualStudio,需要用不同的项目类型编译WRET项目和标准C++项目。因此,对于我需要构建的每个项目,我需要有两个构建相同源代码的项目。例如,需要使用两个不同的项目来编译引擎。一次,对于我想要运行的每个平台。这意味着每次我需要在每个平台上运行和测试它时,我都需要手动将启动项目设置为我想要启动的项目。我希望这是有道理的 所

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

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


谢谢

> P>我有许多C++库,用于构建“经典”Win32桌面、Windows 10桌面、UWP和Xbox。大多数代码是Win32 C++或DirectX。对于游戏、音频和渲染,这些平台有着非常明显的重叠,这也是我关注的焦点

我有一个博客系列,它捕获了我使用的许多“最佳实践”,您可能希望参考:

在一些情况下,我需要与Windows运行时API进行交互。在某些上下文中,我使用由
\uuucplusplus\uwinrt
保护的C++/CX扩展。在某些情况下,我通过低级ABI使用WRL(坦白说,这很难看,但我不需要做那么多)。C++/CX仅由微软Visual C++支持,所以WRL或更好的C++ C++是新项目的一个更好的选择。 具体例子如下:

  • 游戏板-

  • 键盘-

  • 老鼠-

  • XAudio2设备枚举-

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

每个平台都有自己的实现,如基于云的存储、存储/授权API、多人匹配/连接等。因此,如果您实现了它们,您也需要将它们隔离开来

综上所述,你应该考虑一下你对这个项目的目标是什么。如果你想创建一个游戏,可以使用像UnrealEngine或Unity这样的现成工具。如果你想更多地了解图形和游戏技术,如Direct3D、音频等,那么一个小型引擎是一个好主意,但你真的应该将你的目标平台扩展到一些简单的东西上。编写一个“多平台”引擎是一项艰巨的任务,因此坚持一个引擎启动通常是更好的选择


对于Windows,Microsoft正在解决这些问题:请注意(在Xbox上不确定),您现在可以使用标准Win32桌面应用程序中的许多WinRT API(标记为双合同的)。你也可以看看WinUI3(不是2):这些都是很棒的资源,谢谢!那么你真的会推荐我现在这样做吗?有两个不同的项目将在两个不同的时间编译源代码?显然,这是两个不同的可执行文件,但从工作流的角度来看,这有点笨重:一个App_UWP.vcxproj和一个App_Win32.vcxproj,以及一个Engine_UWP.vcxproj和Engine_Win32.vcxproj。如果可能的话,您可能希望让引擎项目“共享”,这样它只构建一次代码,然后隔离这些项目中所有的UWP和Win32。当然,您始终可以在每个平台vcproj中构建相同的“共享”源文件。我一直在维护并行项目,只是因为做得好需要搞乱定制道具,但这在技术上也是可行的。我现在就是这样组织的。引擎源代码位于共享项项目(.vcxitems)中,然后
engine.*
根据每个平台的需求构建这些文件。这就是你所说的分享吗?