2010-06-04 105 views
5

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

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

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

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

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

+0

也发现这个,一些有用的意见:http://stackoverflow.com/questions/2664254/how-does-porting-between-linux-and-windows-work – LearnCocos2D 2010-06-04 19:46:34

+1

“第一步是绝对移动所有平台,将特定的代码放到代码库的一个区域中;这个区域应该只有很少或没有特定于应用程序的东西,然后为新的目标操作系统重新编写代码的这部分代码。 – LearnCocos2D 2010-06-04 19:56:06

回答

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),并且只开发一次库。

+0

我知道如果你构建一个游戏引擎,这是正确的方法,但是如果游戏引擎已经存在并且在整个地方都有特定于平台的调用呢? 可能仍然是一个好主意,那么我最终会得到一堆void函数,我可以稍后用实际代码填充代码编译完成时的错误代码,那是您的意思吗? – LearnCocos2D 2010-06-04 17:52:08

+0

编辑我的回复澄清。 – John 2010-06-04 18:52:16

+0

我认为在RenderBadGuy中简单地注释掉“特定于windows”的东西比较容易,因为它无论如何都不会在目标平台上编译,然后我不必更改函数的名称。这两个端口不太可能并行开发。我主要关心的是如何让它在新平台上运行。但感谢这个想法让我想到了! – LearnCocos2D 2010-06-04 19:44:04