如何使用自定义引擎在多个平台上运行?


13

Unity和Unreal等游戏引擎可以在多种平台上运行。我想知道他们是如何做到的。

我已经使用C ++和OpenGL已有一段时间了,我正在寻找的资源是集成一些东西,使我可以在不同的平台上运行而无需重写。类似于LibGDX,您可以使用基本API编写代码,然后该API将其转换为HTML,Android,iOS等。我知道我可以使用其他引擎代替编写自己的引擎,但是我对学习经验很感兴趣。

Answers:


26

将您的引擎移植到每个平台。没什么特别的。如果您有一些仅适用于Windows的代码,则可以在文件中添加一些#ifdef逻辑,或者添加第二个文件(这样您便拥有FooWindows.cpp和/ FooLinux.cpp或任何其他功能)即可在您关心的其他操作系统上实现该功能。

一键发布可以允许像Unity这样的引擎发布的内容,因为最终用户永远不会修改Unity本身。您只是在编写脚本和数据,因此引擎为所有平台预先构建了二进制文件,而“发布”按钮只是将这些二进制文件与数据捆绑在一起。

其他引擎依赖于构建系统和交叉编译器在需要时创建已编译的游戏,就像您对任何非游戏跨平台应用程序所做的一样。

对于HTML5之类的东西,有诸如emscripten之类的工具可以编译C ++应用程序以在JavaScript中运行。基本上,您只需要为引擎添加另一个端口即可进行脚本描述(因为它不能使用任何任意的C ++库/功能)。

您不必重写整个游戏,但是绝对必须为您要支持的每个新平台进行大量开发,编码和移植工作。


14
根据我在跨平台软件(最大的项目是HotSpot)上的经验,您确实希望避免在代码中抛出ifdef。最好使用类似share/os/<linux>(或share/cpu/x86)之类的东西,并将所有特定于平台的代码放入其中,然后进行条件包含。至少这是gcc,HotSpot和Linux内核的功能(当然不是硬性规定)。是的,您可能只从依赖于平台的单个功能入手,并认为它是过大的,但它永远不会这样,否则很快就会变得一团糟。
Voo

14

这里没有魔术子弹。如果您想让游戏在多个平台上运行,则必须为多个平台编写代码(或利用已经为您完成此任务的第三方库)。

您要求的内容不一致:您说的(强调我的意思)

我正在寻找的是整合一些资源的资源,这些资源将使我可以在不同平台上运行而无需重写

但也(再次强调我的意思)

我知道我可以使用其他引擎代替编写自己的引擎,但是 我对学习经验很感兴趣

您几乎要做一件事:选择使用为您提供跨平台支持的第三方库,引擎和/或工具链,或者通过编写跨平台代码(设计您的在您可以使用的平台上拥有自己的抽象,并为每个平台实现该抽象)。

游戏引擎如虚幻或Unity支持这种要么重新编译代码到适当的平台抽象,或要求你建立对他们的内部API库或DLL,这是他们从一个特定平台的驱动程序可执行文件加载,他们已经编制了相应的平台。


2

与其他两个答案(正确地是C ++特定)相反,还有另一种方法。我想到的一些架构:

  • 移植引擎:修改或编写代码,使其可在多个平台上运行。这在上面的答案中得到了解决。
  • 在跨平台库上方编写一些东西:这是在Java上运行的libGDX的示例。Java在台式机,Android和iOS上运行(通过RoboVM)。通过使用类似Java的工具,当基础库/工具支持它们时,您将获得免费的其他平台的好处。在这种情况下,当RoboVM出现时,libGDX(几乎)在iOS上“正常工作”。
  • 编写代码生成器:这是Haxe和其他工具的方法。您有一种核心语言(例如Haxe / AS3),并且编写的转换器生成其他语言的输出。例如。Haxe可转换为台式机的C ++,适用于Android的Java(我认为)等。

就我个人而言,我发现libGDX的方法是最简单的:找到满足您需求的语言或平台,然后再写。代码生成和可移植引擎很复杂,很难编写。

libGDX实际上是一个不错的选择,因为它同时可以在主要的手机,台式机和Web上运行(通过applet或Google的Web编译器)。


即使使用Java或C#,您也不会神奇地获得跨平台代码。您仍然必须意识到可能具有平台依赖性的第三方库(例如,对于跨平台的C#项目,SlimDX或SharpDX将是一个糟糕的选择)。

与滚动自己的C ++引擎并将其跨平台移植相比,@ JoshPetrie肯定会获得很多“免费”的回报。
ashes999

@ ashes999感谢您的回答,libGDX非常出色,我确实使用过它,但是我将要编写它,以便它可以跨平台工作,然后再使用CMake,相比于使用现有的库或引擎,我所面临的挑战更多
DanielCollier 2014年

2

目前,我正在构建一个跨平台的游戏引擎。我正在使用SDL,它是用于构建图形应用程序的出色的(也是适当的低级别)跨平台库,可以减轻痛苦。

但是,除此之外,每个平台还有很多“自定义代码”。这只是您必须解决的问题。到目前为止,我发现这只是我开发时间的一小部分,大部分时间用于查找不如我的本机Linux熟悉的系统的文档。

我不鼓励您#ifdef在整个代码中使用任何地方。相反,围绕关键原语构建抽象(此类原语的示例可能是TCP套接字)。

当您遇到一个新问题,每个环境需要不同的解决方案时,请问自己“我是否可以仅使用已经构建的跨平台原语来解决此问题?” 如果答案为是:瞧,简单的跨平台代码。否则,找出缺少的原语并实现它们。


0

如果您想“从头开始”学习,那么您将需要使用Win32 API,您可以在MSDN和OpenGL Wiki(http:// www上找到有关打开窗口和OpenGL上下文的信息。.opengl.org / wiki / Creating_an_OpenGL_Context_(WGL))。对于Linux,请获取《 O'Reilly Xlib编程手册》和《Xlib参考手册》的二手副本,还可以阅读GLX(X窗口系统的OpenGL扩展)。另请参见http://www.opengl.org/wiki/教程:_OpenGL_3.0_Context_Creation_(GLX)

然后,您只需要为您的应用程序提供相同的API,即可使用具有相同功能(例如,打开窗口)但每个平台具有不同实现的函数。您为不同的平台重写了部分引擎。然后,您使用引擎编写的游戏只需要编写一次,但它将在不同的平台上运行。


感谢您的回答,但我宁愿仅将SDL2用于窗口,其跨平台且非常易于使用。LibGDX如何使用LWJGL进行窗口显示
DanielCollier 2014年
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.