如何将游戏引擎移植到另一个平台?

6
我之前遇到过这个问题,想听听别人的经验和建议。假设你有一个工作稳定但相对较小的游戏引擎,只适用于一个平台,而你想将它移植到另一个平台。
第一步很明显:你需要拿到代码,将其与新平台的库链接起来,对项目或目标构建设置进行必要的更改,然后点击构建。大约会出现五到二万个错误。当然,有很多是重复的,但这立即引发了下一个问题:接下来该怎么办?
你如何处理将游戏引擎移植到另一个平台,或者任何平台特定的代码,由于系统和API设计的固有变化,这些代码不能在其他平台上编译?你如何处理所有这些错误?你如何确定应该首先解决哪些部分?
总体来说,我应该如何处理现有源代码的移植?
我正在寻求关于如何处理源代码移植的一般建议。假设编程语言和编译器在两个平台上都是相同的,所以主要是API的更改。

我还发现了一些有用的评论:https://dev59.com/d03Sa4cB1Zd3GeqPtkLB - CodeSmile
1
第一步是将所有特定于平台的代码移动到代码库的单个区域中;这个区域应该有很少或没有应用程序特定的内容。然后为新的目标操作系统重写这个隔离的代码部分。 - CodeSmile
1个回答

3

一个标准的做法(或许)是将所有特定于平台的调用进行封装,并在整个代码中使用这些包装函数,而不是使用特定于平台的函数。这样,如果你可以在两个平台上一一匹配使用的方法(可能比想象的更难),那么你就可以用你的包装函数替换调用哪个特定于平台的函数,而不改变代码中的其他逻辑。

举个例子:

void RenderBadGuy(int badGuyID)
{
    // Windows-specific bad-guy rendering code here
}

目前您可以只写 ("G_" 代表通用)

void G_RenderBadGuy(int badGuyID)
{
    RenderBadGuy(badGuyID);
}

这会给你的引擎增加一些开销,但这不应该破坏你已有的东西(只是多了一个函数调用)。
现在,每个使用 RenderBadGuy 的地方都改成使用 G_RenderBadGuy。对所有方法都重复此操作,然后稍后你可以将代码切换到类似于以下内容:
void G_RenderBadGuy(int badGuyID)
{
    // now we're rendering on a Mac
    RenderBadGuy_Mac(badGuyID);
}

然后你的主引擎就不会改变了。

你可能可以比这个实现更好、更通用(函数指针,我不知道),但那就是这个想法。

或者,你可以像Java一样,让你的库与一个模块交互,该模块则知道你平台的具体情况。只需为每个平台开发不同的模块(如VM),然后你只需要开发一次你的库。


我知道,如果你要构建一个游戏引擎,这是正确的方法。但是如果游戏引擎已经存在,并且在各个地方都有特定于平台的调用呢?这仍然可能是个好主意,那么我最终会得到一堆空函数,一旦代码编译无误,我就可以填充实际的代码了,这就是你的意思吗? - CodeSmile
编辑了我的回复以澄清。 - John
我认为最简单的方法是在RenderBadGuy中注释掉“仅限Windows”的部分,因为它在目标平台上无法编译,这样我就不必更改函数名称了。两个端口不太可能同时开发。我的主要问题是如何首先在新平台上运行它。但还是谢谢你的想法,让我思考了一下! - CodeSmile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接