3D游戏如此高效?

有一些我从来没有明白。 一个像GTA IV这样伟大的大型PC游戏如何使用我的CPU的50%,以60fps的速度运行,而一个旋转的茶壶@ 60fps的DX演示使用高达30%?

一般来说,这是因为

  1. 游戏正在优化他们需要渲染的东西
  2. 他们特别利用你的硬件。

例如,你可以做一个简单的优化,而不是实际上试图画出无法看到的东西。 考虑一下像“ 侠盗猎车手4”这样一个复杂的场景。 渲染器实际上并不渲染所有的build筑物和结构。 相反,它只是渲染相机可以看到的东西。 如果你可以飞到那些相同的build筑物的后面,面对原来的相机,你会看到一个半build的镂空的shell结构。 照相机无法看到的每一点都不会呈现,因为您看不到它,所以没有必要尝试向您展示它。

此外,当您针对特定硬件进行开发时,会存在优化的指令和特殊技术,以实现更好的加速。

你的问题的另一部分是为什么一个演示使用如此之多的CPU:

而一个旋转茶壶的DX演示@ 60fps使用高达30%?

graphicsAPI的演示(如dxdemo )在您的硬件不支持所有需要显示一个漂亮的例子的function时, dxdemo会回到所谓的软件渲染器 。 这些function可能包括阴影,reflection,光线追踪,物理等等。

这模拟了一个完全全function的硬件设备的function,这是不太可能存在的,以展示API的所有function。 但是由于硬件实际上并不存在,它运行在你的CPU上。 这比委托给显卡要低效多了 – 因此你的CPU使用率很高。

耐心,技术和耐力。

首先,DX Demo主要是一个辅助教具,所以它的清晰度和执行速度都没有改变。

这是一个非常重要的主题,但是游戏的开发主要是要把你的数据和执行path理解成几乎病态的程度。

  1. 你的代码是围绕着两件事情来devise的 – 你的数据和你的目标硬件。
  2. 最快的代码是永远不会被执行的代码 – 将您的数据分成批次,只对您需要的数据执行昂贵的操作
  3. 如何存储您的数据是关键 – 为了连续访问,您可以高速批量处理。
  4. 把所有可能的东西都摊平
  5. 现代的CPU很快,现代的RAM非常慢。 caching未命中是致命的。
  6. 尽可能多地向GPU推送 – 它具有快速的本地内存,因此可以通过数据进行扫描,但是您需要通过正确组织数据来帮助它。
  7. 避免做大量的渲染器切换(再次将批量相似的顶点数据放在一起),因为这会导致GPU停止
  8. 调整您的纹理,并确保它们是两个幂 – 这提高了GPU上的纹理caching性能。
  9. 尽可能多地使用细节级别 – 基于距离摄像机播放器的3D模型的低/中/高版本以及切换 – 如果屏幕上只有5个像素,则无法渲染高分辨率版本。

3D游戏非常擅长欺骗你的眼睛。 例如,有一种称为屏幕空间环境光遮挡(SSAO)的技术,通过遮蔽接近表面不连续的场景的那些部分,会给予更真实的感觉。 如果你看看你的墙壁的angular落,你会看到他们在大多数情况下看起来比中心稍暗。

使用基于相当准确的模拟的光能传递可以达到同样的效果。 光能也会考虑到弹跳灯的更多效果等,但是这在计算上是昂贵的 – 这是一种光线追踪技术。

这只是一个例子。 有几百个实时计算机graphicsalgorithm,他们基本上是基于良好的逼近,并通常做出很多假设。 例如,根据摄像机的速度,典型位置以及场景几何体的变化量,必须非常仔细地select空间sorting。

这些“优化”是巨大的 – 你可以有效地实现algorithm,使其运行速度提高10倍,但select一个智能algorithm产生类似的结果(“作弊”)可以让你从O(N ^ 4)到O日志(N))。

优化实际的实现是使游戏效率更高,但这只是一个线性优化。

Eeeeek!

我知道这个问题是旧的,但令人兴奋的是没有人提到VSync !!!

您将60fps的游戏的CPU使用率与60fps的茶壶演示的CPU使用率进行比较。

是不是很明显,都在60帧/秒运行(或多或less)? 这导致了答案…

这两个应用程序运行vsync启用! 这意味着(虚弱)渲染帧率被locking到显示器的“垂直空白间隔”。 graphics硬件(和/或驱动程序)将仅在最大时渲染。 60fps的。 60fps = 60Hz(Hz =每秒)刷新率。 所以你可能使用一个相当古老,闪烁的CRT或一个普通的LCD显示器。 在一个以100Hz运行的CRT上,你可能会看到高达100Hz的帧速率。 VSync同样适用于LCD显示器(它们通常具有60Hz的刷新率)。

所以,茶壶演示可能实际上运行效率更高! 如果它使用CPU时间的30%(与GTA IV的50%CPU时间相比),那么它可能每帧使用更less的CPU时间,并且在下一个垂直空白间隔中等待更长的时间。 要比较这两个应用程序,你应该禁用vsync并再次测量(你将测量更高的两个应用程序的fps)。

有时它可以禁用vsync(大多数游戏在其设置中有一个选项)。 有时,当vsync被禁用时,你会看到“撕裂的文物”。

你可以find它的细节,以及为什么它在维基百科使用: http : //en.wikipedia.org/wiki/Vsync

虽然这里的许多答案提供我将如何回答更简单的问题为什么的极好的迹象

  • GTA4 第一周就拿到了4亿美元
  • Crytech写了一个非常令人印象深刻的graphics演示,让nVidia在展会上炫耀。 由此产生的印象让他们创build了FarCry。
  • Valve公司2005年的收入和营业利润分别为7000万美元和5500万美元。

也许最好的例子(肯定是最知名的)之一是Id软件。 他们很早就意识到,在Keen指挥官 (3D版之前)的时代,即使它依靠现代硬件(在这种情况下是EGA显卡!这将使你的游戏脱颖而出的竞争。 这是事实,但他们进一步认识到,与其不必自己想出新的游戏和内容,他们可以许可技术,从而获得他人的收入,同时能够开发下一代引擎,从而再次跳跃竞争。

这些程序员的能力(加上商业头脑)使他们富有。

这就是说激励这样的人并不一定是金钱。 实现这个目标的愿望可能是一样的。 他们在初期赚到的钱只是意味着他们现在有时间去投入他们喜欢的东西。 虽然许多外部的利益几乎都还在计划中,并试图找出比上次迭代更好的方法。

简单地说,写茶壶演示的人可能有一个或多个以下问题:

  • 更短的时间
  • 更less的资源
  • 奖励激励较less
  • 较less的内部和外部竞争
  • 较小的目标
  • 较less的人才

最后可能听起来很刺耳2,但显然有一些人比其他人好,钟形曲线有时会有极端的结果,而且往往会被这种技巧的相应极端所吸引。

其中较小的目标实际上可能是主要原因。 茶壶演示的目标只是一个演示。 但不是程序员技能的演示3 。 这将是一个(大)操作系统的一个小方面的演示,在这种情况下DX渲染。

对于那些观看演示的人来说,只要看起来够好,就不会使用比所需更多的CPU。 没有受益人时,没有消除浪费的动力。 相比之下,游戏更喜欢有更好的AI,更好的声音,更多的多边形,更多的效果的备用周期。


  1. 在这种情况下,在PC硬件上平滑滚动
  2. 可能比我多,所以我们很清楚这一点
  3. 严格来说,这也是他/她的经理的一个演示,但是这里的驱动力又是时间和/或视觉质量。

由于几个原因

  • 3D游戏引擎被高度优化
  • 大部分的工作是由您的graphics适配器完成的
  • 50%嗯,让我猜你有一个双核心,只有一个核心使用;-)

编辑:给几个号码

配备NV-6800 GPU的2.8 Ghz Athlon-64。 结果是:

  • CPU:72.78 Mflops
  • GPU:2440.32 Mflops

有时候一个场景可能会比现在还要多。 例如,具有数千个顶点的旋转茶壶,环境映射,凹凸映射和其他复杂像素着色器都被同时渲染,这相当于一大堆处理。 这些茶壶演示很多时候只是为了炫耀某种特殊效果。 当绝对性能不是目标时,它们也可能不能总是充分利用GPU。

在游戏中,您可能会看到类似的效果,但通常会以妥协的方式完成,以最大化帧速率。 这些优化扩展到游戏中看到的所有内容。 问题在于:“我们如何用最less的处理能力创造出最壮观,最逼真的场景呢? 游戏程序员是最好的优化器之一。

  1. 场景pipe理。 kd-trees,frustrum culling,bsps,heirarchical包围盒,局部可见性集。
  2. LOD。 转出较低的细节版本来代替遥远的物体。
  3. 骗子。 像LOD,但不是一个对象只是一个图片或“广告牌”。
  4. SIMD。
  5. 自定义内存pipe理。 alignment的内存,更less的碎片。
  6. 自定义数据结构(即没有STL,相对较less的模板)。
  7. 大会地点,主要是SIMD。

通过给出的所有合格和良好的答案,重要的仍然是缺less的:Windows的CPU利用率计数器不是很可靠。 我猜这个简单的茶壶演示只是在它的空闲循环中调用渲染函数,在缓冲区交换时阻塞。

现在,Windows CPU使用率计数器只是查看每个进程中花费的CPU时间,而不使用这个CPU时间。 尝试添加一个

 Sleep(0); 

刚刚从渲染函数返回后,进行比较。

另外,为了节省计算能力,从艺术的angular度来看还有很多技巧。 在许多游戏中,特别是较老的游戏中,阴影被预先计算并“烘焙”成地图的纹理。 很多时候,艺术家们试图用飞机(两个三angular形)代表像树木和特殊效果的东西,看上去大致相同。 游戏中的雾是避免渲染遥远物体的简单方法,而且游戏通常会为远,中,近视图的每个对象提供多种分辨率。

任何答案的核心应该是这样的 – 3D引擎执行的转换主要是在加法和乘法(线性代数)(无分支或跳转)中指定的,单个帧的绘图操作通常以多重这样的add-mul的工作可以并行完成。 GPU核心是非常好的添加多个的,他们有几十个或数百个添加核心。

CPU只剩下简单的东西 – 比如AI和其他游戏逻辑。

一个像GTA IV这样伟大的大型PC游戏如何使用我的CPU的50%,以60fps的速度运行,而一个旋转的茶壶@ 60fps的DX演示使用高达30%?

虽然GTA很可能比DX演示效率更高,但是这种方式来衡量CPU的效率基本上被打破了。 效率可以被定义为例如你在每个给定时间做了多less工作。 一个简单的反例:每个逻辑CPU产生一个线程,让一个简单的无限循环运行。 您将获得100%的CPU使用率,但效率不高,因为没有有用的工作完成。

这也导致了一个答案:一个游戏如何有效? 在编写“伟大的大型游戏”时,大量的努力致力于优化游戏的各个方面(现在通常还包括多核优化)。 至于DX演示,其重点不是跑得快,而是展示概念。

我认为你应该看看GPU的利用率,而不是CPU …我敢打赌,在GTA IV中显卡比在茶壶样品(它实际上应该是空闲的)要忙得多。

也许你可以使用这个监视器来检查:

http://downloads.guru3d.com/Rivatuner-GPU-Monitor-Vista-Sidebar-Gadget-download-2185.html

也可以考虑帧速率,也许茶壶样品是全速运行(可能是1000fps),大多数游戏仅限于显示器的刷新频率(约60fps)。

看看vsync的答案; 这就是为什么他们运行在相同的帧率。

其次,CPU在游戏中错过了领先。 一个简单的解释是主游戏循环只是一个无限循环:

 while(1) { update(); render(); } 

即使你的游戏(或在这种情况下,茶壶)没有太多的工作,你仍然在循环中吃掉CPU。

GTA中的50%CPU是“更有效率”,然后是演示中的30%,因为很可能它没有太多的工作; 但GTA正在更新大量的细节。 即使在演示中添加“睡眠(10)”,也可能会使CPU的性能下降一吨。

最后看看GPU的使用情况。 该演示可能在现代video卡上只占不到1%,而GTA可能会在游戏过程中占据多数。

总之,你的基准和测量不准确。

DX茶壶演示没有使用30%的CPU做有用的工作。 这是忙碌的等待,因为它没有别的事情要做。

从我所知道的“虚幻”系列中,一些约定被打破为封装。 代码根据游戏编译为字节码或直接编译为机器码。 此外,对象被渲染和包装在一个网格的forms和事情,如纹理,照明和阴影预先计算,而作为一个纯粹的3Danimation需要这个实时。 当游戏实际运行时,也有一些优化,例如只渲染对象的可见部分,只有在closures时才显示纹理细节。 最后,video游戏很有可能在特定的时间里获得最好的平台(例如:Intelx86 MMX / SSE,DirectX,…)。

我认为这里找不到答案的重要部分。 大多数的答案告诉你“了解你的数据”。 事实是,你必须以同样的方式,同样重要的程度也知道你的:

  • CPU(时钟和caching)
  • 内存(频率和延迟)
  • 硬盘(在速度和寻找时间方面)
  • GPU(#cores,时钟及其内存/高速caching)
  • 接口:Sata控制器,PCI修订版等

但是 ,最重要的是,对于目前的现代电脑,你将永远无法以>> 30ftp播放实际的1080pvideo(64bit中的单个1080p图像需要15000 Ko / 14.9MB)。 原因是因为采样/精度。 一个video游戏永远不会对像素,图像,数据等使用双精度(64位),而是使用较低的自定义精度(〜4-8位),有时使用插值技术重新调整精度,以允许合理的计算时间。

还有其他一些技巧,例如剪切数据(包括OpenGL标准和软件实现),数据压缩等等。请记住,从硬件能力的angular度来看,目前的GPU可以比当前的CPU快300倍以上。 然而,一个好的程序员可能会得到10-20倍的因素,除非你的问题是完全优化的,并且完全可并行化(特别是任务可并行化)。

根据经验,我可以告诉你,优化就像一个指数曲线。 为达到最佳性能,所需时间可能非常重要。

所以要回到茶壶,你应该看几何如何表示,采样,以什么精度Vs在几何/纹理和最重要的细节(精度,采样等)方面看到GTA 5,