像Valve这样的公司如何在所有三个主要游戏平台上发布游戏?我对代码共享方面的最佳实践特别感兴趣,尤其是在Windows、Xbox360和PS3之间。因为理想的解决方案是尽可能地重用代码,而不是为每个平台重新编写整个代码。
在其他情境下编写平台无关的代码并没有什么不同。将平台特定的细节(输入、窗口交互、主事件循环、线程等)隐藏在通用接口后,并在您打算支持的所有平台上进行定期测试。
请注意,Cell的线程模型足够不寻常,以至于进行“通用”线程需要一些小心。我不是Valve的员工,也不知道他们的任何秘密,但我了解大多数想要针对PS3的游戏开发人员会使用作业队列,个别单元处理器按需获取任务。这不一定是使用Cell的最佳方式,但它可以很好地推广到更传统的线程模型(例如PC和360都使用的模型)。
有许多与游戏开发杂志文章和GDC演讲有关的内容。事实上,既然您提到了Valve,在GDC08上他们发表了一篇描述他们方法的演讲。
这真的是一个非常大的主题,我可以(并且已经)谈论数小时,但电梯摘要是:
确定引擎的哪些部分是完全特定于平台的,并将它们放在一个抽象层后面。例如,文件和资产加载需要为每个控制台重新编写;但是您可以将其隐藏在提供统一API的IFileSystem接口后面,游戏代码与之交互。在教育电脑游戏领域还没有被The Learning Company瓦解之前,我有一个朋友非常喜欢创建跨平台库来完成所有任务。
对于游戏来说,这比其他应用程序更容易。例如,如果您要在Mac和Windows上运行文字处理应用程序,它确实需要在Mac上看起来和表现得像Mac应用程序,在Windows上则需要像Windows应用程序一样。编写游戏时,它不必遵循本地行为、外观和感觉。