c++ Gamedev中的编程(性能相关)

mzaanser  于 2023-08-09  发布在  其他
关注(0)|答案(8)|浏览(88)

我只是想知道一些事情如何在gamedev中工作:
1.我知道,性能实际上是至关重要的,因此仍然(我认为永远不会)没有地方仅仅因为它们的性能就将托管语言/平台用作Java/.NET。但是......最近我在SO上读到,尽管人们创建游戏时使用C作为主要语言,但他们实际上没有使用STL或Boost(或很多)。在认为这与表演有共同之处,对吗?如果我错了,你能告诉我为什么要避免这些库(我认为这些库会让开发人员的生活更轻松)吗?是因为许可(Boost)吗?那么EA的STL版本呢?其他工作室也有自己的版本吗?
1.游戏编程到底有多“接近金属”?你会更深入、更靠近机器吗?您是否有时会将汇编用于关键的内部循环,或者C
实际上是您目前使用的最低抽象层?我假设在性能是最重要的产品中,分析是非常、非常常见的任务--但是您是否有时被迫使用汇编来加快某些部件的速度,或者好的C++“已经足够好了”?
编辑:抱歉,可能还不清楚,但我对有游戏行业经验的人的答案很感兴趣。我对那些没有游戏开发商业经验的人给出的一些假设不感兴趣。我也对用C#/Java创建的一些利基游戏的例子不感兴趣。然而,如果你知道一个产品,看起来比FarCry 2更好(只是一个例子,但你最喜欢的现代伟大的外观游戏名称在这里),并写完全在Java/.NET,并有类似的性能FarCry 2.不要犹豫,提到这个产品!- 谢谢-谢谢

km0tfn4u

km0tfn4u1#

1.与某些信念相反,STL是相当优化的,根本不是坏代码。大多数游戏工作室不使用它的原因是内存。您无法像编写自己版本的STL容器那样控制内存分配和释放。这也是为什么托管语言不是首选的原因。
编写自己的容器可以让你更容易地编写跨平台代码和进行内存跟踪。在游戏机上尤其如此,例如PS3,需要详细的硬件知识才能获得最佳性能。这通常最终意味着您需要完全控制PPU、SPU和RSX之间的内存流。
2.汇编器只是“必需的”(在引号中,因为它实际上不是必需的,但有帮助)对于非常专业的操作,例如。数学库函数。更常见的是SIMD intrinsic,它将代码向量化。然而,大多数工作室都有相当优化的遗留代码,并且由于这些优化是相当低的级别,因此不需要在硬件代之间大幅更改代码。我会说在控制台上,你使用低级代码的情况要普遍得多。

v7pvogib

v7pvogib2#

我知道,性能实际上是至关重要的,所以仍然(我认为永远不会)没有地方使用托管语言/平台作为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
社区的输入,作为他们(和许多游戏开发人员)希望从未来修订标准中看到的一个例子(它也提交给了标准委员会)

ttygqcqt

ttygqcqt3#

我可以推荐C++ for game programmers这本书。它深入讨论了c++特性的性能成本,如STL,异常和RTTI。它还涉及到拥有自己的内存管理器和各种常见的性能优化。
显然有一个new edition出来,但它有一个不同的作者。这是怎么回事?

pgvzfuti

pgvzfuti4#

约1:

我还没有尝试过EA的STL版本,但我可以从我自己的游戏开发经验中证实,STL有时会成为瓶颈。到目前为止,我总是能够找到变通办法,虽然。
Boost可能非常有用,但它实际上取决于Boost的特定部分是否对性能关键型代码有帮助。例如,Boost::filesystem对我来说非常有用,而boost::signals由于性能非常差而几乎无法使用。所以我使用FastDelegates实现了自己的信令库。

约2:

大多数情况下,你可以使用常规的C++代码。一旦游戏开始运行,您就可以使用分析器识别瓶颈,然后就可以开始优化这些代码。即使这样,如果你做得好,你可能不需要写任何汇编代码。
例如,我定制的2d游戏引擎没有硬件加速。我开发它的时候,3D驱动程序仍然相当bug,大多数休闲游戏玩家都有过时的显卡驱动程序,所以当时兼容性比纯粹的性能更重要。
尽管如此,在我们的游戏最新游戏Gemsweeper中,我们使用了大量的alpha混合8位alpha蒙版,游戏仍然必须在500 MHz CPU上运行。因此,Alpha混合变成了性能关键领域。
为了优化这一点,我使用了VectorC编译器,这样我就可以利用MMX、SSE等,而不必编写汇编代码。但是,相同的代码在一个CPU上可能很快,而在另一个CPU上可能很慢(例如Intel vs. AMD),所以我也用不同的优化设置编译了几次alpha混合代码。游戏在运行时运行一个基准测试,以找到每种位传输方法的最快位传输模块,并从那时起使用该模块。
我将结果与其他一些2d混合库进行了比较,其中一个声称是纯手工优化的汇编器,我的引擎在不同CPU上的平均性能大致相同。

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

vlju58qv

vlju58qv5#

我们使用'STL'(即。标准C库)和少量Boost。然而,其中一些被避免或不被允许(std::map,std::list,boost::shared_ptr),通常是因为过度丰富的内存分配策略或较差的缓存一致性。这些通常可以解决,例如。我们使用自定义分配器,但是我们有其他方法来解决同样的问题,它们有自己的好处。
至于它到底有多接近金属,这要看情况。在我们的项目中,C
是我们的最低级别。在这个工作室的另一个项目中,有一个小的装配,特别是在非PC平台上。如今在某些项目中,你很可能会受到GPU和CPU的限制,因此低级代码优化的日子越来越少,优化着色器和艺术资产的日子越来越多。
但是,要小心声称Java/.NET等从未使用过。并不是每个人都需要FarCry 2的性能(这是一个相当过分的规格),这就是为什么你看到越来越多的游戏用C++编写的托管语言只是为了优化。

ut6juiuv

ut6juiuv6#

在游戏开发中,STL确实没有被使用。尽管某些人总是急于声称,他们也从来没有使用Java或C#或其他托管语言。
我说的不是小型X-Box Live Arcade游戏下载或网络浏览器游戏,或诸如此类的东西。我说的是AAA级游戏的高端开发。
他们不使用STL。但是,它们确实使用了自己的自定义实现,看起来很像STL。会有智能数组,会有哈希表,会有智能指针,它们只是不会是STL。
控制台具有一些与PC非常不同的性能特征。即使是专门针对PC的游戏项目通常也使用过去用于控制台项目的代码库。为了使基本的模板结构按预期工作,需要进行大量的调整。
大多数游戏工作室还希望代码能够适应其他平台。锁定到一个实现从微软/索尼/任天堂使更多的痛苦,当谈到时间的游戏移植到一个新的平台。所提供的模板库(不一定是STL)通常不太出色。至少他们在硬件周期的早期是这样的,当一个工作室正在熨平他们计划在未来五年继续使用的引擎时。
在我工作过的工作室里,我当然看到了相当程度的“非在这里构建”的态度,以消除第三方代码。有时是正当的,有时不是。在基本数据结构模板的情况下,它通常是。
至于你的第二个问题,汇编程序偶尔会用到。但只有在孤立的情况下,大量的数学需要非常频繁地发生。整个引擎可能包含两个或三个asm块的小文件。

rqmkfv5c

rqmkfv5c7#

您可以通过查看游戏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。
还有很多,如果你看。很多代码并不是特别干净或灵活(有时甚至不快),但我认为在你编写的代码中调整东西比在充满难以理解的template-fu的整体库中更容易。

qq24tv8q

qq24tv8q8#

不,你基本上错了。.NET和Java都被用于商业游戏,当然是在Windows上(也可能在游戏机上)。
STL也被广泛使用,我知道相当大比例的业余游戏开发人员使用它。
不使用STL的主要原因可能是惰性,以及使用不使用STL的第三方库/引擎。
我想在历史上,在一些平台上,没有好的STL实现,特别是在RAM有限的东西,如PS2上。

相关问题