gamedev编程(性能相关)

时间:2009-10-10 10:50:06

标签: c++ video-game-consoles

我只是想知道gamedev中有些东西是如何工作的:

  1. 我知道,性能实际上是至关重要所以仍然(我认为永远不会)因为Java / .NET而无法使用托管语言/平台他们的表现。但是......最近我在这里读过SO,即使创建游戏的人使用C ++作为主要语言,他们实际上使用STL或Boost(或其中很多)。认为它与性能有一些共同点,对吧?如果我错了,你能告诉我避免这些库的原因是什么(我认为让开发人员的生活更容易)?是因为许可(Boost)?那么EA的STL版本呢?其他工作室也制作自己的版本吗?

  2. “接近金属”游戏编程真的如何?你是否越来越接近机器?你有时使用Assembly来进行关键的内部循环,或者C ++实际上是你目前使用的最低抽象层吗?我认为在性能最重要的产品中,性能分析是非常非常常见的任务 - 但是你有时会被迫使用汇编来加速某些部分,或者好的C ++“足够好”吗?

  3. 编辑: 对不起,可能不太清楚,但我对拥有游戏行业经验的人的答案很感兴趣。我对那些没有游戏开发商业经验的人给出的假设感兴趣。我也对使用C#/ Java创建的一些小众游戏的例子不感兴趣。但是,如果你知道一个看起来比FarCry2更好的产品(只是例子,但是你最喜欢的现代游戏名称),并且在Java / .NET中写得完全,并且具有与FarCry2相似的性能...不要犹豫提这个产品!感谢。

8 个答案:

答案 0 :(得分:10)

1。 与某些观点相反,STL已经过优化,而且根本不是坏代码。大多数游戏工作室不使用它的原因是内存。您没有对内存分配和释放进行过多控制,就好像您要编写自己的STL容器版本一样。这也是托管语言不是首选的原因。

编写自己的容器可以让您编写跨平台代码并更轻松地进行内存跟踪。在控制台上尤其如此,例如PS3,需要详细的硬件知识才能获得最佳性能。通常最终意味着您需要完全控制PPU,SPU和RSX之间的内存流。

2。 对于非常专业的操作,汇编程序只是“必需”(在引号中,因为它实际上不是必需的,但有帮助),例如数学库函数。更常见的是SIMD内在函数,它可以对代码进行矢量化。但是,大多数工作室都有遗留代码,这些代码经过了相当优化,而且由于这些优化程度非常低,因此不需要在硬件生成之间大大改变代码。我会说在游戏机上使用低级代码更为常见。

答案 1 :(得分:7)

  

我知道,性能实际上至关重要,所以仍然(并且我认为永远不会)因为它们的性能而无法使用托管语言/平台作为Java / .NET。

不,你不知道这个。您认为,您想要相信它,因为您将游戏开发浪漫化,并且因为您认为高级语言不能快速。 对于90%的游戏来说,.NET性能非常好。它只会变得更好。托管平台必须更慢,没有固有的原因。他们有潜力更快,因为他们是JIT'。实际上,它们的性能往往与相当不错的C ++代码大致相同,比典型的 C ++代码要好得多,而且比真正优秀的C ++代码差一些。而且大多数大型游戏无论如何都使用多种语言。他们使用脚本语言,如Lua或Python,或者一些家庭酿造的东西,所有这些都比.NET慢一些。

同样,绝对没有理由说你的大部分游戏都不能用.NET编写。然后,如果有必要,可以在以后将三个真正的性能关键函数移植到本机C ++。

  

但是......最近我在这里读过SO,即使创建游戏的人使用C ++作为主要语言,他们实际上也不使用STL或Boost(或者很多)。认为它与性能有一些共同点,对吧?如果我错了,请你告诉我避免这些库的原因是什么

同样,你犯了上面的罪...对游戏开发的迷信。 “哦,不,我们不能使用其他人的代码!这太低效了”。在编程实践和方法方面,游戏开发在80年代陷入困境。换句话说,不要过于担心其他游戏开发者的行为。如果STL或Boost使您的代码更容易编写,那么使用它!然后,如果遇到性能问题,请对其进行概要分析,如有必要,请使用您自己的库组件替换该特定的库组件。

但是大多数STL实际上是零开销。 任何游戏中95%的代码性能至关重要。像对待任何其他节目一样对待游戏开发。不要将它视为一些神奇的土地,每一行代码必须完美优化,并且不适用普通规则。

  

EA的STL版本怎么样?其他工作室也制作自己的版本吗?

据我所知,没有。 EA将其部分用于内部使用,但也作为整体C ++社区的输入,作为他们(以及许多游戏开发者)希望从未来的标准修订中看到的一个例子(它被提交给了标准委员会也是如此)

答案 2 :(得分:3)

我可以推荐这本书C++ for game programmers。它深入讨论了诸如STL,异常和RTTI等c ++特性的性能成本。它还涉及拥有自己的内存管理器以及各种常见的性能优化。

似乎有一个new edition,但它有一个不同的作者。怎么了?

答案 3 :(得分:2)

关于1:

我还没有尝试过EA的STL版本,但我可以从我自己的游戏开发经验中确认STL有时可能成为瓶颈。到目前为止,我总能找到解决方法。

Boost可能非常有用,但它确实取决于提升的特定部分是否对性能关键代码有帮助。例如,Boost :: filesystem对我来说非常有用,而boost :: signals由于性能非常差而几乎无法使用。所以我使用FastDelegates实现了我自己的信令库。

关于2:

大多数情况下,您将使用常规C ++代码。一旦游戏运行并且您可以识别分析器的瓶颈,您就可以开始优化这些代码片段。即便如此,如果你做得对,你可能不必编写任何汇编代码。

例如,我的定制2D游戏引擎在没有硬件加速的情况下运行。我开发它时,3D驱动程序仍然非常多,大多数休闲游戏玩家已经过时的显卡驱动程序,因此兼容性比当时的纯粹性能更重要。

尽管如此,在我们的游戏最新游戏Gemsweeper中,我们使用了大量的alpha混合8位alpha蒙版,游戏仍然必须在500 mhz cpu上运行。因此,alpha混合被证明是一个性能关键领域。

为了优化这一点,我使用了VectorC编译器,这样我就可以利用MMX,SSE等,而无需编写汇编代码。但是相同的代码可以在一个CPU上快速运行而在另一个CPU上速度较慢(例如Intel与AMD),因此我还使用不同的优化设置多次编译alpha混合代码。游戏在运行时运行基准测试,为每个blitting方法找到最快的blitting模块,然后使用该模块。

我将结果与其他一些2d混合库进行了比较,其中一个声称是纯手工优化的汇编程序,我的引擎平均具有相同的性能,在不同的CPU上测量。

底线: 在开始编写汇编程序之前,不要先测量并优先考虑替代方案。这通常会产生足够好的结果,并且会为您节省大量时间。

答案 4 :(得分:2)

我们使用'STL'(即标准C ++库)和少量Boost。然而,有些内容通常是针对过度旺盛的内存分配策略或不良的缓存一致性而避免或不赞成(std :: map,std :: list,boost :: shared_ptr)。这些通常可以解决,例如。使用自定义分配器,但我们有其他方法来解决相同的问题,并有自己的好处。

至于它与金属的接近程度,取决于它。在我们的项目中,C ++是我们的最低级别。在这个工作室的另一个项目中,有一个小组件,特别是在非PC平台上。现在在某些项目中,你很可能受到GPU和CPU的限制,因此低级代码优化的日子越来越少,优化着色器和艺术资产的日子越来越多。

警惕声称从未使用过Java / .NET等。并不是每个人都需要FarCry2的性能(这是一个相当过分的规范),这就是为什么你会看到越来越多用C ++编写的托管语言游戏只是为了优化。

答案 5 :(得分:1)

您可以通过查看游戏SDK来了解自己(在某种程度上)。

几乎所有id Tech 4游戏(DooM III,Prey,Quake IV,ET:QW)都有SDK,包括物理,脚本,AI,数学等系统。唯一使用的asm是专门的数学代码,其他一切都是纯C ++。

Crytek有一个Crysis SDK(你需要安装游戏来安装SDK)和Far Cry SDK。

Valve通过Steam购买了Source游戏的任何人都可以使用Source SDK。

如果你看,还有很多。很多代码都不是特别干净或灵活(有时甚至不是很快),但我认为在你编写的代码中调整内容比在完全难以理解的模板fu的单片库中更容易。

答案 6 :(得分:1)

在游戏开发中确实没有使用STL。尽管某些人总是急于求助,但他们也从不使用Java或C#或其他托管语言。

我不是在谈论小型X-Box Live Arcade可下载游戏或网页浏览器游戏等。我在谈论AAA游戏的高端开发。

他们不使用STL。但是,他们确实使用自己的自定义实现,看起来很像STL。会有智能阵列,会有哈希表,会有智能指针,它们就不会是STL。

控制台具有一些与PC非常不同的性能特征。即使是专门针对PC的游戏项目,通常也会使用过去曾用于控制台项目的代码库。很多调整都是为了使基本模板结构按预期工作。

大多数游戏工作室也希望能够适应其他平台的代码。当将游戏移植到新平台时,锁定MS / Sony / Nintendo的实现会带来更多痛苦。提供的模板库(不一定是STL开头)通常不太常见。至少在硬件周期的早期,当工作室正在熨平他们计划在未来五年内继续使用的引擎时,它们就是这样。

在我工作过的工作室里,我肯定看到了一种“不建这种”的态度来解雇第三方代码。有时它是合理的,有时它不是。对于基本数据结构模板,通常是。

至于你的第二个问题,偶尔会使用汇编程序。但只有在需要经常发生大量数学运算的孤立情况下。整个引擎可能包含两个或三个asm块的小文件。

答案 7 :(得分:0)

不,你错了。 .NET和Java都已经在商业游戏中使用,当然也可以在Windows上使用(也可能在游戏机上)。

STL也被广泛使用,我知道相当大比例的业余游戏开发者都在使用它。

可能不使用STL的主要原因是惯性,并且使用不使用STL的第三方库/引擎。

我认为历史上在某些平台上,良好的STL实现是不可用的,特别是在像PS2这样的RAM限制的东西上。