【问题标题】:Single DirectX/C++ project for both WinAPI and WinRTWinAPI 和 WinRT 的单个 DirectX/C++ 项目
【发布时间】:2016-05-20 16:31:26
【问题描述】:
目前我正在开发一个简单的游戏引擎项目。我希望它独立于平台,所以一开始我只采用了经典的 Windows 桌面应用程序和 Metro Style 应用程序。
从这张照片:
Windows APIs
我们可以看到 C/C++ 块对于这两个部分是通用的。换句话说,我想在平台配置之间轻松切换。我创建了简单的 WinAPI 静态库,您可以轻松地将其包含在项目中,以及 DirectX 游戏引擎,它运行良好。但是,我在使用 WinRT(用于 Metro Style 应用程序)时遇到了问题。
是否可以拥有一个可以使用 WinAPI 或 WinRT 的 Visual Studio 项目?如果我可以拥有一个游戏的单一入口点并且只需切换底层 API,那将是完美的。
【问题讨论】:
标签:
c++
winapi
windows-runtime
directx
game-engine
【解决方案1】:
没有。生成经典 win32 exe 和 WinRT(现在的通用)应用程序的单个 VS 项目是不可能的。
理论上,它们本可以实现这一点,就像您可以拥有一个生成控制台应用程序或 gui 应用程序的项目一样。两者之间的差异归结为一个(或两个)标志。
经典的 exe 和 WinRT 应用程序的区别是相当大的:有清单和包装和特殊的酱汁签名更不用说资源(图标等)的指定不同。
在 Visual Studio UI 中,这通过一组不同的属性页表现出来,当然,除了编译器 + 链接器的共同核心。
另一个原因是策略之一。 Microsoft 希望您继续前进并拥抱 WinRT API。这是适用于所有 Windows 设备的 API 集(如果您忽略房间里的 Win7 大象)。支持双模式会向开发者发送错误的信号。
附带说明,Windows 标头 (windows.h) 由 API 系列注释。 CreateNamedPipe 在 WinRT 应用程序中是 #ifdef,或者例如,CreateFile 用于经典应用程序,CreateFile2 用于现代应用程序。
【讨论】:
-
一个包含 UWP 和经典 Windows 桌面应用程序的单个 vcxproj 在理论上可以使用大量自定义 .props 文件,但通常是巨大的痛苦和脆弱。最好为每种类型提供并行的 vcxproj 文件,并共享代码。我将这种技术用于 DirectXTK、DirectXTex、DirectXMesh。至于如何在所有这些上下文中构建代码,请参阅this article,但请记住,“appmodel”是完全不同的,因此共享实用程序代码是好的,而不是共享 UI。