在现代游戏设计中,游戏的哪些部分被编写为可移植的
In modern game design, which portions of the game are written to be portable?
假设你是一家大公司,正在制作一个巨大的、轰动性的标题,目标是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();
可以在多个地方使用。
- C++Union/Struct位域的实现和可移植性
- 具有Qt事件循环的可移植通用共享库设置
- 没有执行策略的 std::transform_reduce 是可移植的吗?
- 如何在 c++ 中正确指定 #include 路径以使程序可移植
- 创建异构顶点数据数组的可移植方法
- FlatBuffers/Protobuf 中是否有支持任意 24 位有符号整数定义的可移植二进制序列化架构?
- 静态库可移植性
- 从非类型模板参数声明 constexpr 数组的可移植方法
- C++:Unicode 字符串文字的可移植性
- 如何使Visual Studio 2017 C++项目在计算机之间更具可移植性
- 尝试将 sfml 和 c++ 与 Windows 10 上的可移植 vscode 链接起来
- 在C++中获取命名空间名称的任何可移植技巧
- STR这个实现是否安全且可移植?
- 编写 std::copysign 的可移植 SSE/AVX 版本
- 是可移植的包装结构
- 将参数推送到调用堆栈 (C++) 的可移植方法
- 在为视频游戏实施基本的二进制序列化时,请担心可移植性
- 如何以可移植方式删除名称为 wchar_t 类型的文件C++
- Xcode 8.3.2 中的错误警告:文件的非可移植路径 - 指定的路径与磁盘上的文件名不同
- 在现代游戏设计中,游戏的哪些部分被编写为可移植的