6

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

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

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

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

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

4

1 回答 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),您只需开发一次库。

于 2010-06-04T16:22:44.410 回答