1

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

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

  2. 游戏编程到底有多“接近金属”?您是否更深入、更靠近机器?您是否有时将汇编用于关键的内部循环,或者 C++ 实际上是您目前使用的最低抽象层?我认为在性能是最重要的此类产品中,分析是非常非常常见的任务 - 但是您有时是否被迫使用汇编来加速某些部件,或者好的 C++ “足够好”?

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

4

8 回答 8

10

1. 与某些看法相反,STL 已经非常优化,而且代码一点也不差。大多数游戏工作室不使用它的原因是内存。您对内存分配和释放的控制不如您编写自己的 STL 容器版本。这也是托管语言不受欢迎的原因。

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

2. 对于非常专业的操作,例如数学库函数,汇编程序仅是“必需的”(在引号中,因为它实际上不是必需的但有帮助)。更常见的是对代码进行矢量化的 SIMD 内在函数。但是,大多数工作室都有经过优化的遗留代码,并且由于这些优化级别很低,因此不需要在硬件世代之间进行重大更改的代码。我会说在控制台上使用较低级别的代码更为常见。

于 2009-10-10T11:30:10.840 回答
7

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

不,你不知道这个。你认为它,你愿意相信它,因为你把游戏开发浪漫化了,因为你认为高级语言不能很快。.NET 性能对于 90% 的游戏来说已经足够好了。它只会变得更好。托管平台必须更慢没有内在的原因。它们有可能更快,因为它们是 JIT 的。在实践中,它们的性能往往与相当好的 C++ 代码大致相同,比典型的C++ 代码好得多,但比真正好的 C++ 代码稍差。无论如何,大多数大型游戏都使用不止一种语言。他们使用脚本语言,如 Lua 或 Python,或一些自制的东西,所有这些都比 .NET 慢几个数量级。

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

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

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

但大多数 STL 几乎都是零开销。任何游戏中95% 的代码都不是性能关键的。像对待任何其他编程一样对待游戏开发。不要把它当作一个神奇的地方,每一行代码都必须完美优化,正常规则不适用。

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

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

于 2009-10-10T11:55:07.107 回答
3

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

Appearlenty有一个新的版本,但它有不同的作者。那是怎么回事?

于 2009-10-10T11:22:22.763 回答
2

关于1:

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

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

关于2:

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

例如,我定制的 2d 游戏引擎在没有硬件加速的情况下运行。我是在 3D 驱动还存在很多 bug 的时候开发的,大多数休闲游戏玩家的显卡驱动已经过时了,所以在那个时候兼容性比纯粹的性能更重要。

尽管如此,在我们最新的游戏 Gemsweeper 中,我们使用了大量的 alpha 混合与 8 位 alpha 掩码,并且游戏仍然必须在 500 mhz cpu 上运行。所以阿尔法混合原来是一个性能关键领域。

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

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

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

于 2009-10-10T11:14:12.120 回答
2

我们使用“STL”(即标准 C++ 库)和少量 Boost。然而,其中一些被避免或反对(std::map、std::list、boost::shared_ptr)通常是因为内存分配策略过大或缓存一致性差。这些通常可以解决,例如。使用自定义分配器,但是我们有其他方法来解决相同的问题,并有自己的好处。

至于它到底有多接近金属,这取决于。在我们的项目中,C++ 是我们使用的最低级别。在这个工作室的另一个项目中,有一些组装,尤其是在非 PC 平台上。如今,在某些项目中,您可能会受到 GPU 和 CPU 的限制,因此低级代码优化的日子越来越少,而优化着色器和艺术资产的日子越来越多。

Be wary of claiming that Java/.NET etc is never used however. Not everybody needs the performance of FarCry2 (which is a pretty excessive spec) which is why you're seeing more and more games written in managed languages with C++ just for optimisation.

于 2009-10-12T09:49:30.663 回答
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。

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

于 2009-10-10T16:10:15.737 回答
1

诚然,在游戏开发中,并没有使用 STL。尽管某些人总是急于声称,他们也从不使用 Java 或 C# 或其他托管语言。

我不是在谈论小型 X-Box Live Arcade 可下载游戏或网络浏览器游戏,或类似的东西。我说的是 AAA 游戏的高端开发。

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

控制台有一些与 PC 非常不同的性能特征。即使是专门针对 PC 的游戏项目也通常使用过去用于控制台项目的代码库。为了使基本模板结构按需要工作,需要进行大量调整。

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

在我工作过的工作室中,我确实看到了相当程度的“不是在这里构建”的态度来拒绝第三方代码。有时它是合理的,有时它不是。在基本数据结构模板的情况下,通常是这样。

至于您的第二个问题,偶尔会使用汇编程序。但仅在需要非常频繁地进行大量数学运算的孤立情况下。一个完整的引擎可能包含两个或三个小的 asm 块文件。

于 2009-10-10T18:01:29.957 回答
0

不,你基本上错了。.NET 和 Java 都被用于商业游戏,当然是在 Windows 上(也可能在游戏机上)。

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

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

我想过去在某些平台上,没有好的 STL 实现可用,尤其是在诸如 PS2 之类的 RAM 受限的东西上。

于 2009-10-10T12:34:51.420 回答