有关创建跨平台游戏的任何提示?[关闭]


Answers:


44

将任何平台特定的东西隐藏在抽象层后面

这意味着诸如渲染,音频,用户输入和文件IO之类的东西。在不引起运行时性能损失的情况下抽象化的一个常见技巧是与平台无关的标头和特定于平台的实现文件:

// FileSystem.h
class FileSystem {
public:
    FileHandle OpenFile(const char * path);
    // other stuff...
}

// FileSystemWindows.cpp
FileHandle FileSystem::OpenFile(const char * path) {
    // call windows API...
}

然后为每个平台配置构建,以针对正确的.cpp文件进行构建。

使您的内容管道读取与平台无关的资产,并为每个平台输出平台特定的内容

例如,将您的纹理创作为.tga或只是.psd,然后拥有一个可以自动将其转换为所需的不同平台特定格式的管道。

不要在数据中假设特定的内存布局或字节序

平台的字节顺序,填充,对齐和字长可能有所不同。任何关心此问题的代码都必须在所有平台上进行全面测试。

随时在所有平台上进行测试

被特定于平台的错误所困扰。您是现在想被咬还是在尝试将游戏发布出去时被咬?


2
缺乏#ifdef PLATFORM_WINftw
tenpn

您将永远无法逃脱。您可以希望将其最小化。
优厚

8
这样做的一个好方法是将所有平台特定的代码移动到具有相同接口的一组共享库中,然后可以将#ifdef限制为为平台引导正确的库。
尼尔

1
+1,很好的评论。请记住,即使STL也是依赖于平台的(是的,有些函数在不同的编译器上执行不同的操作)。
西蒙2010年

确定要调用额外的功能会降低性能吗?CPU必须从寄存器中加载或移动数据,或更糟的是,存储器仍然很慢。系统调用是否足够?
TheBlueCat 2013年

10
  • 使用像opengl / sdl这样的api,当从一个平台到另一个平台时,它将给您带来最小的麻烦。

  • 确保您知道要支持的平台。不要仅仅因为您认为将来可能要支持多平台而使用opengl。按照您的意思继续进行。

  • 了解您要支持的每个平台上的硬件限制。


第二点不能足够强调。确保您知道游戏的目标用户(这意味着,如果它是休闲游戏,则至少要在OSX和Windows上使用它,因此OpenGL将是最佳选择)。至于第三点-这就是引擎发挥作用的地方-也很重要。使用像Unreal这样功能丰富,占用大量资源的引擎制作DS游戏是不合逻辑的。这一点也与我对第二个问题所说的有关:确定游戏的目标对象。如果您要玩休闲游戏,那么大多数人的计算机将无法处理粒子。

7

尽量避免分散#if defined(_FOO_) ... #elif defined(_BAR_) ... #else ... #endif所有代码。

有时看起来这是更简单的方法,但是从长远来看,它将给您带来麻烦。您应该尝试将它们限制在自己的文件中,以便每个平台实现都是独立的。

添加平台应该主要是添加新的实现文件,而只需修改一些需要的现有文件即可。


4

有很多库本身就是跨平台的。您无需直接在OpenGL中编写即可在任何地方运行。OGRE是渲染引擎的一个很好的例子,它可以在您要命名的任何平台上运行。

以我的经验,最大的担忧是您的构建系统。如果您使用Visual Studio在Windows上进行开发,则您的代码可能会在Linux上编译,但是要使其易于构建将很困难。看一下像CMake这样的构建系统,它们可以使用相同的构建指令来生成特定于平台的项目文件(Linux上的makefile,Windows上的VS Project,Mac上的XCode Project等)。


4

在编写用于保存和加载文件或通过网络进行通信的函数时,请不要忘记endianness

与其创建一个ReadByte / WriteByte和ReadFloat / WriteFloat,而不是通过一次调用fread / fwrite或类似的低级操作来读取大型结构。如果以后决定使用其他平台,则可以进行更改的地方将更少。


+1 *9000。我认为这实际上仅适用于现代/二手架构(RISC)的移动电话;但仍然至关重要。
乔纳森·迪金森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.