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

时间:2010-06-04 16:04:13

标签: porting game-engine

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

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

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

一般情况下:我应该如何移植现有的源代码?

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

1 个答案:

答案 0 :(得分: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),您只需开发一次库。