3D游戏的效率如何?[关闭]


188

有一些我从未理解过的东西。像GTA IV这样的大型PC游戏如何使用50%的CPU并以60fps的速度运行,而旋转茶壶@ 60fps的DX演示则要使用高达30%的速度?


124
我看不出这个问题有什么问题-对其他开发人员如何完成某些事情感到好奇是很自然的。我们应该鼓励这种好奇心,而不是以严密的票数来惩罚它。
约翰·费米内拉

2
@ user146780:谁问了这个问题...我在CGI工作时遇到的最好的程序员。来自SGI的Gurus,致力于Adobe Photoshop并行处理的人们,等等。这里的人们没有意识到编写现代游戏有多么复杂,也没有意识到这些编码人员的熟练程度。如果您想获得谦逊的体验,请看看来自Cryotech的德国人对Crysis引擎所做的事情。YouTube上有视频。您简直不敢相信。这不仅仅是关于“使用八叉树”。通常,这些程序员比普通程序员要熟练得多。您可以打赌,GT4编码器非常出色。
语法T3rr0r,2010年

2
您以60 fps的速度运行了gta4 !?GW!gta4是一个运行不佳的POS,我听说“力量发动”也是如此。我想说幸福感是元凶。老实说,“ CPU使用率”是一种非常差劲的比较方式,只需打开帧速率并查看运行速度最快的帧,那就是正确的方法。另外,请记住,这个“复杂的游戏”虽然可能会渲染很多东西,但仍然只有一屏值得的东西,如果按正确的顺序渲染,您最终可能会获得与您的像素差不多的像素工作量“简单”的演示,像素的工作真正杀死了它。
马特2010年

8
您需要一个探查器,该探查器向您显示使用了多少GPU(图形处理单元)。我敢打赌,《侠盗猎车手IV》会向您显示约99%,而演示版为3%。
0scar

根据经验,与我合作过的游戏程序员中约有10%不错,其余的充其量只是中等水平。有些人完全没有能力。
Skizz 2010年

Answers:


69

一般来说,这是因为

  1. 游戏需要渲染的内容是最佳的,并且
  2. 他们利用了您的硬件的特殊优势。

例如,您可以进行的一项简单优化就包括不实际尝试绘制看不见的东西。考虑一个复杂的场景,例如侠盗猎车手IV中的城市景观。渲染器实际上并未渲染所有建筑物和结构。相反,它仅渲染摄像机可以看到的内容。如果您可以飞向相同建筑物的后部,面对原始相机,则会看到半建的挖空的外壳结构。相机看不到的每个点都不会被渲染-因为您看不到它,所以无需尝试向您展示它。

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

您问题的另一部分是演示为什么要使用这么多CPU:

...而以60fps旋转茶壶的DX演示使用高达30%的速度?

图形API的演示(例如dxdemo)通常回退到所谓的软件渲染器当您的硬件不支持演示漂亮示例所需的所有功能时。这些功能可能包括阴影,反射,光线跟踪,物理等。

为了模仿API的所有功能,这模仿了一个不太可能存在的功能齐全的硬件设备的功能。但是由于硬件实际上并不存在,因此可以在您的CPU上运行。这比委派显卡要低得多-因此,您的CPU使用率很高。


3
DX演示也使用您的硬件。那么,什么是“特殊”?
tur1ng 2010年

3
但是演示不太可能是最佳的。
µBio 2010年

2
例如,茶壶演示@ tur1ng可能启用了反射阴影和其他效果。
尼克·丹杜拉基斯

2
茶壶可能比GTA4场景具有更多的多边形。事实是,图形渲染的当前瓶颈是更多的纹理效果,例如凹凸贴图派生技术来添加细节和其他后期渲染效果。
克莱姆(Klaim)2010年

5
纹理-茶壶是由大量具有法线和灯光交互作用的单个三角形创建的。游戏中看起来像是一个疯狂而复杂的3D世界,通常是相当简单的大块,上面覆盖着详细的图片。很多“ 3d”是在3d形状上绘制的静态2d图像中的巧妙阴影和透视艺术效果
Martin Beckett 2010年

96

耐心,技术能力和耐力。

第一点是,DX演示主要是一种教学辅助工具,因此这样做是为了清楚起见而不是执行速度。

这是一个相当大的话题,但是游戏开发主要是在几乎病理的程度上了解数据和执行路径。

  1. 您的代码是围绕两件事设计的-数据和目标硬件。
  2. 最快的代码是永不执行的代码-将数据分批处理,并且仅对所需的数据执行昂贵的操作
  3. 存储数据的方式是关键-连续访问的目的是使您可以高速批处理。
  4. 尽可能地Parellise
  5. 现代CPU速度很快,现代RAM速度很慢。高速缓存未命中是致命的。
  6. 尽可能多地推送到GPU-它具有快速的本地内存,因此可以充分利用数据,但是您需要通过正确组织数据来提供帮助。
  7. 避免进行大量渲染状态切换(再次将相似的顶点数据一起批处理),因为这会导致GPU停顿
  8. 搅动纹理并确保它们是2的幂-这可以提高GPU上的纹理缓存性能。
  9. 尽可能多地使用细节级别-低/中/高版本的3D模型,并根据与相机播放器的距离进行切换-如果屏幕上只有5个像素,则无法渲染高分辨率版本。

39

3D游戏擅长欺骗您的眼睛。例如,存在一种称为屏幕空间环境光遮挡(SSAO)的技术,该技术通过遮盖场景中接近曲面不连续性的那些部分来提供更逼真的感觉。如果您查看墙的拐角,在大多数情况下,它们会比中心稍微暗一些。

使用光能传递可以达到非常相同的效果,这基于相当精确的模拟。光能传递还将考虑反射光等带来的更多影响,但是它在计算上非常昂贵-这是一种射线追踪技术。

这只是一个例子。用于实时计算机图形的算法有数百种,它们基本上是基于良好的近似值,通常会做出很多假设。例如,必须根据速度,摄像机的典型位置以及场景几何形状的变化量非常仔细地选择空间排序。

这些“优化”是巨大的 -您可以高效地实现算法,并使它的运行速度提高10倍,但是选择能产生相似结果(“作弊”)的智能算法可以使您从O(N ^ 4)变为O(N log(N))。

优化实际的实现是使游戏更加高效的原因,但这仅仅是线性优化。


30

哎呀!

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

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

两者是否都以60fps的速度运行(或多或少),这不是很明显吗?这导致了答案...

两个应用程序都启用了vsync才能运行!这意味着(降低)渲染帧速率被锁定到显示器的“垂直空白间隔”。图形硬件(和/或驱动程序)将仅以最大速度渲染。60fps。60fps = 60Hz(Hz =每秒)刷新率。因此,您可能会使用过时的,闪烁的CRT或普通的LCD显示器。在以100Hz运行的CRT上,您可能会看到高达100Hz的帧速率。VSync也以类似的方式应用于LCD显示器(它们通常具有60Hz的刷新率)。

因此,茶壶演示实际上可以更有效率地运行!如果它使用30%的CPU时间(而GTA IV则是50%的CPU时间),则它可能每帧使用更少的CPU时间,并且等待下一个垂直空白间隔的时间更长。要比较两个应用程序,您应该禁用vsync并再次进行测量(两个应用程序都将测量更高的fps)。

有时可以禁用vsync(大多数游戏在其设置中都有一个选项)。有时,当禁用vsync时,您会看到“撕裂的假象”。

您可以在Wikipedia上找到它的详细信息以及使用它的原因:http : //en.wikipedia.org/wiki/Vsync


我同意,要获得更好的比较,您应该禁用vsync。但是,问题的根源仍然存在。茶壶的30%与游戏的50%的CPU使用率之间的差异比通常预期的要小。但是我记得在早期,环境贴图才刚刚开始流行,当时很酷的nVidia演示就是一个环境映射的茶壶。这些演示通常在一天之内甚至不会达到60 fps。我想我的意思是,这些茶壶演示经常会突破新视觉效果的界限。
史蒂夫·沃瑟姆

25

尽管这里的许多答案都很好地说明我将如何回答一个简单的问题,为什么

最好的例子(可能是最著名的例子之一)是Id软件。他们很早就意识到,在指挥官基恩Ken)的时代(早于3D),想出一种巧妙的方法来实现目标1,即使它依靠图形上优于竞争,这将使您的游戏脱颖而出。确实如此,但他们进一步意识到,他们不必自己提出新游戏和内容的方式,而是可以许可该技术,从而从其他人那里获得收入,同时能够开发下一代引擎,从而再次超越竞争对手。 。

这些程序员的能力(加上精通业务)使他们变得富有。

话虽如此,但不一定是金钱会激励这些人。可能有想要实现的愿望。他们在初期所赚的钱只是意味着他们现在有时间致力于自己的享受。并且尽管许多人都具有外部兴趣,但几乎所有人仍然在编程,并尝试找出比上一次迭代做得更好的方法。

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

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

最后一个听起来可能很刺耳2,但显然有些人比其他人更好,钟形曲线有时具有极端,并且倾向于被该技能所做的相应极端所吸引。

实际上,目标偏低可能是主要原因。茶壶演示的目标就是演示。但是不能演示程序员的技能3。这将是(大型)操作系统的一个小方面的演示,在本例中为DX渲染。

对于观看该演示的人来说,只要看起来足够好,它使用的CPU就会超过所需的 CPU 数量。如果没有受益者,将没有动力消除浪费。相比之下,游戏会希望有空闲周期来获得更好的AI,更好的声音,更多的多边形,更多的效果。


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

17

由于一些原因

  • 3D游戏引擎经过高度优化
  • 大多数工作是由图形适配器完成的
  • 50%嗯,让我猜你有一个双核,只使用了一个核;-)

编辑:给几个数字

带有NV-6800 GPU的2.8 Ghz Athlon-64。结果是:

  • CPU:72.78 Mflops
  • GPU:2440.32 Mflops

@stacker:您是否暗示在并非由GPU完成的顶级3D游戏中进行的所有计算实际上都是单线程的,并且有机会填充100%的CPU?这意味着游戏性能会绑定到一个非GPU内核吗?我觉得难以置信。
语法T3rr0r,2010年

4
这并不意味着程序是单线程的,它仅表示至少一个线程的运行速度尽可能快。这是合理的,因为您为什么希望它变慢?另一方面,许多游戏几乎完全是单线程的。在多线程处理时,以有效的方式编写复杂的模拟非常困难,因为并发/分布式系统中的典型情况是接受更多的延迟来购买更多的吞吐量,这对于应该响应的游戏来说是不好的。
Kylotan'2

8

有时,一个场景的发生可能比显示的要多。例如,同时具有数千个顶点的旋转茶壶,环境贴图,凹凸贴图和其他复杂的像素着色器都被渲染,这需要进行大量处理。很多时候,这些茶壶演示只是为了炫耀某种特殊效果。当绝对性能不是目标时,他们可能也不会始终充分利用GPU。

在游戏中,您可能会看到类似的效果,但是通常会以折衷的方式完成这些效果,以最大程度地提高帧速率。这些优化扩展到您在游戏中看到的所有内容。问题是,“如何用最少的处理能力创建最壮观,最逼真的场景?” 这就是使游戏程序员成为最佳的优化程序的原因。


4
  1. 场景管理。kd树,截锥体剔除,bsps,分层边界框,局部可见性集。
  2. 上帝 切换出较低细节的版本以替代较远的对象。
  3. 冒名顶替者。像LOD一样,但甚至不是物体,只是图片或“广告牌”。
  4. SIMD。
  5. 自定义内存管理。对齐内存,减少碎片。
  6. 自定义数据结构(即没有STL,相对最小的模板)。
  7. 组装到位,主要用于SIMD。

4

通过给出的所有合格和良好答案,仍然没有找到一个重要的问题:Windows的CPU使用率计数器不是很可靠。我猜想这个简单的茶壶演示仅在其空闲循环中调用呈现功能,从而阻止了缓冲区交换。

现在,Windows CPU利用率计数器仅查看每个进程中花费了多少CPU时间,而不是该CPU时间的使用方式。尝试添加一个

Sleep(0);

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


我有一个DX茶壶演示,该演示始终使用25%的CPU。原来是因为我使用四核处理器,并且为了将游戏循环锁定为60 fps,所以我有一个“我们到了吗”循环,该循环不断检查时间。我将其更改为sleep(timeToNextFrame),并将cpu的使用率降低到接近0。–
Jonathan Pierce

3

另外,从艺术的角度来看,还有许多技巧可以节省计算能力。在许多游戏中,尤其是较旧的游戏,阴影是经过预先计算的,并直接“烘焙”到地图的纹理中。很多时候,艺术家试图用平面(两个三角形)来表示树木和特殊效果,而它们看起来几乎是相同的。游戏中的雾气是避免渲染远距离物体的一种简便方法,而且对于远景,中景和近景,游戏通常会对每个物体具有多种分辨率。


1

任何答案的核心应该是-3D引擎执行的变换主要是通过加法和乘法(线性代数)(没有分支或跳转)指定的,绘制单个框架的操作通常以这样的add-mul的工作可以并行完成。GPU内核是非常好的add add-mul,它们具有数十个或数百个add-mull内核。

CPU只剩下做简单的事情了,例如AI和其他游戏逻辑。


1

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

虽然GTA很有可能比DX演示更有效率,但是用这种方法来测量CPU效率实际上已被打破。效率可以通过例如您在给定时间内完成多少工作来定义。一个简单的反例:每个逻辑CPU产生一个线程,并在其上运行一个简单的无限循环。您将获得100%的CPU使用率,但效率不高,因为没有完成任何有用的工作。

这也导致了一个答案:游戏如何高效?在编写“大型游戏”时,会花大力气在各个方面优化游戏(如今通常还包括多核优化)。至于DX演示,它的目的不是快速运行,而是演示概念。


1

我认为您应该看一下GPU的利用率,而不是CPU。。。我敢打赌,GTA IV中的显卡比Teapot示例中的要忙得多(实际上应该是闲置的)。

也许您可以使用类似此监视器的内容来检查以下内容:

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

此外,还需要考虑帧速率,也许茶壶示例正在全速运行(可能为1000fps),并且大多数游戏都限于监视器的刷新频率(大约60fps)。


1

查看有关vsync的答案;这就是为什么它们以相同的帧速率运行。

其次,CPU在游戏中处于领先地位。一个简单的解释是,主游戏循环只是一个无限循环:

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

即使您的游戏(或本例中的茶壶)没有做很多事情,您仍然在循环中消耗CPU。

GTA中50%的CPU比演示中的30%的“生产力更高”,因为它根本没有做太多事情。但是GTA正在更新大量细节。即使在演示中添加了“睡眠(10)”,也可能会使CPU减少一吨。

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

简而言之,您的基准和测量结果不准确。


1

DX茶壶演示没有使用30%的CPU做有用的工作。它正忙于等待,因为它无事可做。


0

从我对虚幻系列的了解中可以看出,有些约定像封装一样被破坏了。根据游戏的不同,代码被编译为字节码或直接编译为机器码。同样,对象以网格的形式进行渲染和打包,并且诸如纹理,光照和阴影之类的事物将被预先计算,而作为纯3d动画,则需要如此实时。当游戏实际运行时,还有一些优化,例如仅渲染对象的可见部分,仅在关闭时显示纹理细节。最后,视频游戏有可能被设计为在给定的时间内充分利用平台(例如:Intelx86 MMX / SSE,DirectX等)。


0

我认为答案的重要部分在这里缺失。大多数答案告诉您“了解您的数据”。事实是,您必须以相同的方式和相同的重要性来了解您:

  • CPU(时钟和缓存)
  • 内存(频率和延迟)
  • 硬盘(根据速度和寻道时间)
  • GPU(#核,时钟及其内存/缓存)
  • 接口:SATA控制器,PCI修订版等。

但是,最重要的是,使用当前的现代计算机,您将无法播放>> 30ftp的真实1080p视频(64位中的单个1080p图像将占用15 000 Ko / 14.9 MB)。这样做的原因是由于采样/精度。电子游戏永远不会对像素,图像,数据等使用双精度(64位),而是使用较低的自定义精度(〜4-8位),有时使用插值技术重新缩放精度较低,以进行合理的计算时间。

还有其他技术,例如剪切数据(使用OpenGL标准和软件实现),数据压缩等。还请记住,就硬件功能而言,当前的GPU可以比当前的CPU快300倍以上。但是,好的程序员可能会获得10-20倍的系数,除非您的问题得到了充分优化和完全可并行化(尤其是任务可并行化)。

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

因此,回到茶壶上,您应该了解几何图形如何表示,采样以及在GTA 5中具有什么样的精度Vs(就几何图形/纹理而言,最重要的是细节(精度,采样等))。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.