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

Lea*_*s2D 5 porting game-engine

我以前曾多次遇到过这个问题,并希望了解其他人的经验和建议.假设您有一个工作稳定但相对较小的游戏引擎,只能在一个平台上运行,并且您希望将其移植到另一个平台.

第一步是显而易见的:您获取代码,将其链接到平台库而不是旧库,对项目或目标构建设置进行必要的更改,然后点击构建.出现大约五到二万个错误.当然有很多重复,但它立即提出了下一步应该是什么的问题?

您如何将游戏引擎移植到另一个平台,或者由于系统和API设计的固有变化而无法在另一个平台上编译的任何平台特定代码?你如何处理所有这些错误?您如何识别应首先接近的部件?

一般来说:我应该如何移植现有的源代码?

我正在寻找有关如何处理源代码端口的一般建议.假设两个平台上的编程语言和编译器是相同的,因此它主要是API更改.

Joh*_*ohn 3

教科书的答案(也许)可能是包装所有特定于平台的调用,并在整个代码中使用这些包装器函数,而不是特定于平台的函数。这样,如果您可以在两个平台上一对一地匹配您使用的方法(也许说起来容易做起来难),那么您可以用包装器函数切换调用哪个特定于平台的函数,而不改变其余的你的代码中的逻辑。

假设你有:

void RenderBadGuy(int badGuyID)
{
    // Windows-specific bad-guy rendering code here
}
Run Code Online (Sandbox Code Playgroud)

现在你可以只写(“G_”代表通用)

void G_RenderBadGuy(int badGuyID)
{
    RenderBadGuy(badGuyID);
}
Run Code Online (Sandbox Code Playgroud)

这会给你的引擎增加少量的开销,但这不会破坏你所拥有的东西(只是一个额外的函数调用)。

现在,每个使用 RenderBadGuy 的地方,只需使用 G_RenderBadGuy 即可。冲洗并重复所有方法,现在您可以将代码切换为类似的代码

void G_RenderBadGuy(int badGuyID)
{
    // now we're rendering on a Mac
    RenderBadGuy_Mac(badGuyID);
}
Run Code Online (Sandbox Code Playgroud)

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

您可能可以比这更好、更通用(指向函数的指针,我不知道),但这就是想法。

或者,您可以做类似 Java 的事情,让您的库与一个模块对话,而该模块又知道您的平台的具体情况。只需为每个平台开发不同的模块(如虚拟机),并且您只需开发一次库。