3D游戏如何高效?

时间:2010-02-07 17:19:52

标签: performance opengl direct3d

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

17 个答案:

答案 0 :(得分:96)

耐心,技术技能和耐力。

首先,DX演示主要是一种教学辅助工具,因此为了清晰起见而不是执行速度。

这是一个非常重要的主题,但游戏开发主要是关于理解您的数据和执行路径到几乎病态程度。

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

答案 1 :(得分:70)

一般来说,这是因为

  1. 游戏对于他们需要呈现的内容是最佳的,并且
  2. 他们特别利用您的硬件。
  3. 例如,您可以进行一项简单的优化,而不是实际尝试绘制无法看到的内容。考虑一个复杂的场景,如来自侠盗猎车手IV 的城市景观。渲染器实际上并不渲染所有建筑物和结构。相反,它只渲染相机可以看到的内容。如果你可以飞到这些相同建筑物的后面,面对原始相机,你会看到一个半建成的镂空外壳结构。相机看不到的每一个点都没有渲染 - 因为你看不到它,所以没有必要尝试向你显示它。

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

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

      

    ...虽然旋转茶壶@ 60fps的DX演示使用了惊人的30%?

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

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

答案 2 :(得分:40)

3D游戏非常适合欺骗你的眼睛。例如,存在一种称为屏幕空间环境遮挡(SSAO)的技术,其通过遮蔽接近表面不连续的场景的那些部分来给出更逼真的感觉。如果你看一下墙角,你会发现它们在大多数情况下看起来比中心稍暗。

使用光能传递可以实现同样的效果,光能传递基于相当精确的模拟。光能传递也会考虑到弹跳灯等的更多影响,但它的计算成本很高 - 这是一种射线追踪技术。

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

这些“优化”巨大 - 您可以有效地实施算法并使其运行速度提高10倍,但选择产生类似结果的智能算法(“作弊”)可以让您走从O(N ^ 4)到O(log(N))。

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

答案 3 :(得分:33)

Eeeeek!

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

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

是不是很明显,两者都以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时,您会看到“撕裂的人工制品”。

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

答案 4 :(得分:26)

虽然这里的许多答案提供了如何的出色指示,但我会回答更简单的问题为什么

也许最好的例子(当然最着名的一个)是Id软件。他们很早就意识到,Commander Keen(3D之前)提出了一种聪明的方法来实现 1 ,即使它依赖于现代硬件(在这种情况下是EGA显卡!)图形优于竞争对手,这将使您的游戏脱颖而出。这是真的,但他们进一步意识到,他们不必自己拿出新的游戏和内容,而是可以获得技术许可,从而从其他人那里获得收入,同时能够开发下一代引擎,从而再次在竞争中崭露头角

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

这就是说激励这些人并不一定是金钱。实现这一目标的愿望很可能也是如此。他们在早期赚取的钱只意味着他们现在有时间投入他们喜欢的东西。虽然许多人outside interests几乎所有人仍然编程,并试图找出比上一次迭代做得更好的方法。

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

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

最后可能听起来很苛刻 2 但显然有些人比其他人更好,钟形曲线有时会有极端的结果,他们往往被吸引到相应的极端技能。

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

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


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

答案 5 :(得分:18)

由于一些原因

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

编辑:提供少量数字

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

  • CPU:72.78 Mflops
  • GPU:2440.32 Mflops

答案 6 :(得分:8)

有时一个场景可能比它出现的更多。例如,具有数千个顶点的旋转茶壶,环境映射,凹凸贴图和其他所有同时渲染的复杂像素着色器等于大量处理。很多时候,这些茶壶演示只是为了展示某种特殊效果。当绝对性能不是目标时,他们也可能无法始终充分利用GPU。

在游戏中你可能会看到类似的效果,但它们通常是以妥协的方式完成的,以最大限度地提高帧速率。这些优化扩展到您在游戏中看到的所有内容。问题在于,“我们如何以最少的处理能力创造最壮观,最逼真的场景?”这就是让游戏程序员成为最好的优化者的原因。

答案 7 :(得分:5)

  1. 场景管理。 kd-trees,frustrum culling,bsps,heirarchical bounding boxes,partial visibility set。
  2. LOD。切换较低的细节版本以代替远处的物体。
  3. 冒名顶替。像LOD一样,但甚至不是一个对象只是一张图片或'广告牌'。
  4. SIMD。
  5. 自定义内存管理。对齐记忆,减少碎片。
  6. 自定义数据结构(即没有STL,相对最小的模板)。
  7. 组装到位,主要用于SIMD。

答案 8 :(得分:5)

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

现在Windows CPU利用率计数器只是查看每个进程中花费了多少CPU时间,而不是如何使用此CPU时间。尝试添加

Sleep(0);

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

答案 9 :(得分:3)

此外,从艺术的角度来看,有许多技巧可以节省计算能力。在许多游戏中,特别是旧游戏中,阴影被预先计算并“烘焙”到地图的纹理中。很多时候,艺术家试图使用平面(两个三角形)来表示树木和特殊效果之类的东西,而它们看起来大致相同。游戏中的雾是一种避免渲染远距离物体的简单方法,而且游戏通常会为远视图,中视图和近视图提供多个分辨率。

答案 10 :(得分:2)

  

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

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

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

答案 11 :(得分:2)

我认为你应该看一下 GPU利用率而不是CPU ...我敢打赌,GTA IV中的显卡比Teapot样本中的显卡更加繁忙(它应该几乎空闲)。

也许你可以使用像这个监视器这样的东西来检查:

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

同样需要考虑帧率,也许茶壶样本全速运行(可能是1000fps),大多数游戏都限制在显示器的刷新频率(约60fps)。

答案 12 :(得分:2)

查看vsync的答案;这就是他们以相同的帧速率运行的原因。

其次,CPU在游戏中缺少领先优势。一个简单的解释是主游戏循环只是一个无限循环:

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

即使你的游戏(或者在这种情况下,茶壶)没有做太多,你仍然在循环中占用CPU。

GTA中的50%cpu比演示中的30%更“高效”,因为它很可能没有做太多的事情;但是GTA正在更新大量的细节。即使在演示中添加“睡眠(10)”也可能会使它的CPU降低一吨。

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

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

答案 13 :(得分:2)

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

答案 14 :(得分:1)

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

CPU留下了简单的东西 - 比如AI和其他游戏逻辑。

答案 15 :(得分:1)

根据我对Unreal系列的了解,一些约定像封装一样被破坏。代码根据游戏编译为字节码或直接编译为机器代码。此外,对象以网格的形式呈现和打包,并且诸如纹理,光照和阴影之类的事物是预先计算的,而纯3D动画需要这样实时。当游戏实际运行时,还有一些优化,例如仅渲染对象的可见部分并仅在关闭时显示纹理细节。最后,视频游戏很可能是在给定时间内从平台中获得最佳效果(例如:Intelx86 MMX / SSE,DirectX,......)。

答案 16 :(得分:1)

我认为这里缺少一个重要的答案。大多数答案都会告诉您“了解您的数据”。事实上,你必须以同样的方式和同等程度的重要性,也知道你的:

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

但是,最重要的是,使用现有的现代电脑,你将永远无法以&gt;&gt;> 30ftp播放真正的1080p视频(64位的单个1080p图像需要15个000 Ko / 14.9 MB)。原因在于采样/精度。视频游戏永远不会对像素,图像,数据等使用双精度(64位),而是使用较低的自定义精度(~4-8位),有时使用插值技术重新调整精度较低,以便进行合理的计算时间。

还有其他技术,例如剪切数据(使用OpenGL标准和软件实现),数据压缩等。请记住,当前的GPU可以比当前CPU快300倍以上硬件能力但是,一个优秀的程序员可能会获得10-20倍的因子,除非您的问题得到完全优化并且完全可并行化(特别是任务可并行化)。

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

因此,为了回到茶壶,您应该看到几何体如何表示,采样以及Vs在GTA 5中看到的精度,几何/纹理方面,最重要的是细节(精度,采样等)。 )