假设您是一家大公司,并且正在制作一个针对 PC、Mac、Xbox 和 PS3 的巨大、轰动一时的游戏。假设您选择了 C++,大多数工作室都倾向于这样做。您将它的哪些部分编写为可移植代码?真的可以写出便携游戏吗?如果你去一个新的平台,你是否必须重写渲染引擎和用户界面?
4 回答
有根据的猜测是,除了硬件相关代码之外的所有内容都被编写为可移植的。即游戏逻辑、矢量图形、声音(?)是(相当)可移植的,图形输出、内存管理、计时不是(总是)。
有了一个好的库选择,您可能可以最大限度地增加可移植代码的数量。
您当然不能要求您的 PC 游戏玩家使用 360 控制器。
至少必须从头开始重新完成渲染和用户界面。此外,其他依赖操作系统的功能(如网络)很可能必须进行改革。毕竟,boost::asio
可能无法在 PS3 上运行。其他一些特定于处理器的东西,比如矢量化
然而,理想情况下,游戏会使用尽可能多的可移植代码。
通常,我会假设如果有一个物理引擎,那将是可移植的。玩家系统,例如健康、库存、NPC 行为等也将是独立于平台的。您很可能必须重写渲染引擎,具体取决于游戏的用途。由于必须与不同的控制器进行交互,因此用户交互可能会进行一些重写,而这些控制器很可能在每个控制台中以不同的方式访问。
一般来说,如果代码与控制台的 API 交互,则必须重写渲染、矢量化、用户界面、输入等。物理、基本行为、人工智能和健康库存管理等基本代码实际上不需要重写。
所以最后:如果它依赖于硬件,则必须重写或重构。
坚持 DRY 原则也会导致代码更加可移植,因为任何不可移植的代码都是本地化的。
例如,避免在代码中多次这样做:
#if defined(PC)
// create a network connection PC-style
#elif defined(XBOX)
// create a network connection XBox-style
#elif defined(MAC)
// create a network connection Mac-style
#elif defined(PS3)
// create a network connection PS3-style
#endif
相反,做一次并创建一个函数
createNetworkConnection();
您在多个地方使用。