如何学习跨平台游戏开发?

6

像Valve这样的公司如何在所有三个主要游戏平台上发布游戏?我对代码共享方面的最佳实践特别感兴趣,尤其是在Windows、Xbox360和PS3之间。因为理想的解决方案是尽可能地重用代码,而不是为每个平台重新编写整个代码。

7个回答

6

在其他情境下编写平台无关的代码并没有什么不同。将平台特定的细节(输入、窗口交互、主事件循环、线程等)隐藏在通用接口后,并在您打算支持的所有平台上进行定期测试。

请注意,Cell的线程模型足够不寻常,以至于进行“通用”线程需要一些小心。我不是Valve的员工,也不知道他们的任何秘密,但我了解大多数想要针对PS3的游戏开发人员会使用作业队列,个别单元处理器按需获取任务。这不一定是使用Cell的最佳方式,但它可以很好地推广到更传统的线程模型(例如PC和360都使用的模型)。


4

有许多与游戏开发杂志文章和GDC演讲有关的内容。事实上,既然您提到了Valve,在GDC08上他们发表了一篇描述他们方法的演讲

这真的是一个非常大的主题,我可以(并且已经)谈论数小时,但电梯摘要是:

确定引擎的哪些部分是完全特定于平台的,并将它们放在一个抽象层后面。例如,文件和资产加载需要为每个控制台重新编写;但是您可以将其隐藏在提供统一API的IFileSystem接口后面,游戏代码与之交互。
PS3使这变得困难,因为它的抽象点必须完全不同于其他平台的某个地方。即使像碰撞和导航这样的游戏功能也必须为Cell重新编写。
尽可能保持叶子游戏代码(实体,AI,模拟)与平台无关...
但是请接受,即使是最基本的游戏代码有时也需要一些平台特定的#ifdefs,以提高性能或内存或TCR等原因。许多UI将不得不重写,因为制造商有冲突的认证要求。
任何说出“我不担心性能”或“内存不是问题”的人都不应该在薪水表上。

2
说出“我不担心性能”或“内存不是问题”的人不应该在薪资名单上。这很遗憾但却是事实。对于大多数软件来说,如果他们的观点帮助他们快速编写正确的代码,这些人可以提供很大的帮助。但在游戏开发中,他们就像毒药一样 :-/ - David Seiler

3
这个问题可以分为两个不同的问题:“如何编写可移植代码?”和“主流游戏平台有哪些不同的要求?”
第一个问题相对容易回答。《编写可移植代码》一书介绍了抽象非可移植代码的最佳实践: http://books.google.ca/books?id=4VOKcEAPPO0C&printsec=frontcover 将理论转化为实践,Quake 3源代码在将不同的平台划分到单独的C代码库方面做得很好,可在http://www.idsoftware.com/business/techdownloads/上获得。但它没有展示C++模式,例如抽象接口,每个平台只需实现一次。
你的问题的第二部分,“主流游戏平台有哪些不同的要求?”更加困难。然而,值得注意的是,你需要改变的最大领域仍然是渲染器、音频子系统和网络。
每个控制台平台都有一系列认证要求,可通过与各自控制台所有者达成协议来获得。这些要求推动用户体验的一致性,而不是关注游戏玩法或高质量、高层次的问题。例如,你的游戏可能需要显示一个相当有趣的动画加载屏幕,黑屏是不可接受的。
尽早获得这些文档对于在特定控制台平台上开发时做出正确选择至关重要。
最后,如果你无法获得控制台开发套件,建议你将代码从Windows移植到Mac。Mac可以为你提供操作系统端口,确保你不会被绑定在Windows上,同时还可以支持通用二进制文件的处理器端口。这确保了你的代码是大小端无关的。
如果你同时支持PC和Mac,那么如果将来获得第三个平台的访问权限,你将具备很好的支持能力。
补充说明:你写道:
“理想的解决方案是尽可能地重用代码,而不是为每个平台重新编写整个代码。”
在许多游戏移植场景中,理想的解决方案并不是尽可能地重用代码,而是为每个平台编写最佳代码。代码可以在项目之间重用,相对于引擎所需的内容而言,成本相对较低。更合理的目标是针对所有平台都可以运行而无需修改的最低公共内容(打包媒体内容的构建阶段是可以的)。

3
同时开发真是太棒了。你会发现各种各样的错误,如果只在一个平台上进行开发是不会发现这些错误的。
我记得在DOS中,程序员经常会有空指针,因为写入低内存时并不会立即崩溃。但是当你移植到Amiga、Atari ST或Macintosh时,就会出现问题!我曾经告诉一个DOS程序员,在已经发布的游戏中他有几个空指针。他想了几秒钟,然后笑了,“这解释了一些事情。”
现在游戏的预算非常大,同时发布所有平台的游戏非常重要,这样你就不会浪费营销和广告预算。
我的建议是选择一个主导平台,但不要让其他平台落后超过一周。随着你编程的深入,你会发现哪些代码对所有平台都是通用的,哪些是不同的。将不同之处提取到一个或多个特定于平台的区域中。
我的经验是C/C++。如果你需要针对不同的语言进行移植(比如Java和Objective-c),那么这将是一个更大的问题。

2
几年前,Opera的CEO在一次采访中表示,为独立平台开发的关键是摆脱任何单个操作系统/平台库。他接着说,他们开发了自己的库来提高操作系统的性能。
我的假设是,大公司将拥有一个共同的团队,Xbox、PS、Windows、FooOS各自为政。每个平台都需要不同的调整和实现方法。我认为他们不会为所有平台建立一个源文件;相反,他们会为每个操作系统构建一个源文件,从而提高效率。我记得EA曾经比PC版本更早地发布某些游戏主机版,反之亦然。
另一个问题是,不同的游戏主机具有不同的硬件,因此需要不同的编程技术。
有两个极端,一个是构建适用于所有平台的一个源代码(例如Java),但这样可能会导致低效,另一个是编写40个版本,针对每个平台进行优化。

1

在教育电脑游戏领域还没有被The Learning Company瓦解之前,我有一个朋友非常喜欢创建跨平台库来完成所有任务。

对于游戏来说,这比其他应用程序更容易。例如,如果您要在Mac和Windows上运行文字处理应用程序,它确实需要在Mac上看起来和表现得像Mac应用程序,在Windows上则需要像Windows应用程序一样。编写游戏时,它不必遵循本地行为、外观和感觉。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接