在现代游戏设计中,游戏的哪些部分被编写为可移植的

In modern game design, which portions of the game are written to be portable?

本文关键字:游戏 可移植 些部      更新时间:2023-10-16

假设你是一家大公司,正在制作一个巨大的、轰动性的标题,目标是PC、Mac、Xbox和PS3。比方说,你选择了C++,就像大多数工作室倾向于做的那样。你写它的哪些部分是可移植的代码?有可能真正编写一款便携式游戏吗?如果你去了一个新的平台,你必须重写渲染引擎和用户界面吗?

一个有根据的猜测是,除了与硬件相关的代码之外,所有东西都是可移植的。即游戏逻辑,矢量图形,声音(?)是(相当)可移植的,图形输出,内存管理,计时不是(总是)。

有了好的库选择,就可能最大限度地增加可移植代码的数量。

你肯定不能要求你的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();

可以在多个地方使用。