游戏公司如何处理多个平台的编程?

时间:2010-06-08 18:37:23

标签: language-agnostic programming-languages

您经常会看到在Xbox 360,PS3和Windows PC上发布新游戏。

游戏公司如何做到这一点?它是使用不同编译器编译的常见源代码吗?是否需要实际不同的源代码?

示例新闻文章宣布: http://www.gameranx.com/updates/id/502/article/dungeon-siege-3-announced-to-be-developed-by-obsidian/

12 个答案:

答案 0 :(得分:14)

一般来说,绝大多数多平台“AAA”标题都是在Unreal,Source或其他小型引擎等引擎上实现的。这些引擎中的每一个都是针对每个平台自定义实现和优化的,并且可以使用较低级别的API,例如DirectX / OpenGL,后者又使用控制台。这些引擎中的每一个还具有用于平台特定内容(例如,运动控制)的插件,其与硬件的官方驱动程序或API交互。

这些引擎中的许多都支持他们自己的脚本语言或许多东西的钩子,所以它只写一次。

例如,看看虚幻引擎: http://www.unrealtechnology.com/technology.php

大多数最大的引擎,如虚幻引擎都非常灵活和强大,它们允许开发人员编写各种类型的游戏。例如,虚幻引擎不仅用于射击游戏,还用于射击游戏RPG,如质量效应。

请记住,制作游戏的大部分人力都投入到图形,设计师,音频设计,关卡设计等方面,并且所有这些都有自定义编辑器。许多固定部分通常通过脚本语言编程。游戏公司中只有一小部分人真正用C等低级语言编写代码。

答案 1 :(得分:5)

引擎通过提供平台独立层来解决这个问题。 平台之间的情况因图形库而异。线程,时钟和文件系统等;为游戏引擎中的每个平台实现。

我可以调用引擎来渲染由三角形组成的3D模型。 该引擎反过来通过调用平台独立层来呈现此模型,该层使用当前使用的平台的实现。

答案 2 :(得分:4)

游戏公司有两种方式:

1)编写/使用多平台引擎 2)移植游戏

多平台引擎将包含针对特定于平台的操作的抽象(进行Windows API调用,使用DirectX与OpenGL进行渲染等),以便所有工作都可以完成一次,然后为两台计算机构建。通常,这是为Direct3D调用等事情编写简单的包装器方法的问题。大多数较新的游戏引擎都是从头开始构建的,具有多平台支持。其他人正在增加多平台支持。

如果游戏引擎不是多平台,则必须将其转换为在目标平台上运行。这通常是一个由两部分组成的操作。首先,需要为目标平台重做所有API调用和与硬件的接口。第二部分涉及调试和优化游戏的性能。通常,直接端口的性能不会很好,因为代码将采用不适用于新目标平台的特定于平台的优化。

出于各种原因,移植游戏可能会受到性能问题的困扰,通常是尽管视频会被淡化。看看PS3或CoD上的橙色盒子:Wii的现代战争,看看两个端口出错的例子。对于OB,Valve将将游戏移植到EA的任务外包。在第二个例子中,Activision决定将更强大硬件设计的引擎上的游戏移植到较弱的平台上,而不是在一个旨在充分利用Wii的新引擎之上构建游戏。

答案 3 :(得分:3)

许多地方将有不同的团队负责不同的版本。这就是为什么你总会看到一些小的差异。但是,如果选择了可移植语言,这些团队可能能够交换代码。

如果公司生产游戏引擎,开发人员可以在此基础上进行开发,让引擎处理跨平台细节。

我猜测艺术/媒体部门对所有平台都是一样的。

答案 4 :(得分:3)

实际上,有一些框架可以在多个平台上运行。

例如:

  • XNA Framework可以在Windows,Xbox和Windows Phone上运行,代码库基本相同。 (大约90%的相同C#代码可以在所有平台上运行。)
  • Unity 3D支持PC,MAC,浏览器,iPhone,Wii,它也将很快支持Android。

还有其他类似的框架。

此外,大多数流行的游戏引擎(例如Unreal等)都是跨多个平台移植的。

答案 5 :(得分:2)

这通常通过一个处理非时间关键型游戏机制的虚拟机和一个时间关键但特定于平台的操作的抽象层来实现。

特定方法是高度专有的,秘密的,并且是游戏制作者最有价值的资产之一。

答案 6 :(得分:2)

我记得约翰卡马克几年前的一次采访(或者也许是一个.plan文件/博客)。他正在讨论为多个平台开发的问题。 (如果内存服务的时候是他们发布移动平台游戏的时候)他给出的建议是始终以你计划首先支持的最低系统规格来定位平台。他的理由是,扩大规模要比放大规模要容易得多。如果您专注于最新的高端显卡,您可能会结束,具体取决于仅在高端提供的功能。使主流和低端系统缩减非常困难。无论如何,我认为这是非常好的建议。

答案 7 :(得分:1)

这是一个猜测,因为我不为一家制作控制台游戏的公司工作,但从我作为软件开发人员的经验来讲,我想象的很多时候是外部库被用来对付用来编写的源代码一种通用语言,例如C ++或其他东西。可以使用许多核心游戏代码(游戏循环,物理东西等),因为跨平台的库的语法是相同的。

但是,必须编写(和测试)大量代码才能使平台独有。例如,Xbox 360与PS3的大多数(如果不是全部)与显卡相关的代码必须不同。

这使得核心功能具有很大程度的可移植性,然后UI内容和图形相关的东西是特定于平台的(并不总是用于UI)。

此外,大型游戏公司有100多名开发人员在开发项目,因此他们拥有的资源远远超过一些独立开发者。

但它永远不会完美。你总是需要移植一些代码。除非您使用的是Adobe AIR,但您的游戏适用于游戏机(以及谁使用Adobe AIR开发真实游戏?)

答案 8 :(得分:1)

游戏公司使用商业中间件,例如RenderWare,它并不便宜。大多数游戏平台还支持C ++环境,以便编译代码。另外,大多数控制台都带有开发版本(Playstations),并且有模拟器可以测试大多数代码。这个中间件现在归EA所有(就像现场的巨型玩家一样)。创建3D游戏不仅仅是框架。大部分游戏都来自设计文档,该文档记录了游戏和游戏的流程。艺术作品在其他软件(例如Maya和Lightwave)和作为游戏角色的“模型”中完成。

即使它看起来很恐怖,但在编码方面,这并不是什么大不了的事。编写核心功能需要一周或八周,其余的更多是设计和规划。请记住,3D只占整体游戏的10%。这些是我作为前游戏开发者的两分钱。

答案 9 :(得分:1)

不一定与视频游戏相关,但我在GOF(http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612)中所做的最佳演绎是多平台软件。阅读关于窗口系统的案例研究。

答案 10 :(得分:0)

我会说“很大程度上他们没有。”所有的钱都在Windows或控制台中,很多游戏机都需要独家许可。我见过几个端口,但它们总是一个独立的代码库,从以前的版本中分离出来。

答案 11 :(得分:0)

通常他们使用#define(例如在C ++代码中),所以在编译指定平台之前,包含或使用正确的代码。在较大的项目中,有时候游戏的各个部分是完全不同的,用不同的IDE编写,并在不同的(平台特定的)编译器中编译。

根据我的经验示例: 当我为任天堂Wii开发游戏时,我们使用的是Torque游戏引擎。我们在PC上进行编程并为PC编译代码。当一些功能准备就绪时,我们使用Metrowerks CodeWarrior(带有特殊的库等)为Nintendo Wii编译它,将它发送到devkit然后从Nintendo Wii控制台运行。