例如,如果我渲染一个平面,我每秒可以得到 1500 帧。使用简单的混合贴图,帧速率下降到 700(双帧速率下降?!)。在 Microsoft DirectX SDK 示例“视差遮挡映射”中模型很小,不超过 200 个顶点圆,但帧率下降到 400。让我感到困惑的是,像孤岛危机这样的游戏结合了所有最新和最重的着色器效果(镶嵌比视差映射重得多),是的,我可以在超设置下输出 50 FPS。这比 SDK 示例少 6 倍,但 Crysis 在屏幕上渲染数十万个顶点 + 效果比 SDK 示例多倍。
2 回答
在像这样的简单示例中查看帧速率并不是一个非常有意义的性能衡量标准。DirectX 旨在为您以大约 60 fps 的每帧渲染大量几何图形的类似游戏的工作负载提供高效,而不适用于您以 100 或 1000 fps 的速度渲染非常简单的几何图形的合成测试。基于像这样单独测量帧速率,您无法推断出关于渲染特定对象的相对性能的任何非常有用的信息。软件和硬件设计用于 16.6 毫秒帧的最大吞吐量,而不是最小延迟。
在查看 DirectX 性能时,您需要记住很多事情是并行进行的。在典型的游戏中,CPU 将在 GPU 渲染第 n-1 帧时为第 n 帧发出绘制命令。GPU 管道可能会为来自一个绘制调用的三角形着色像素,同时对来自不同调用的三角形进行光栅化,并处理来自另一个调用的顶点,所有这些都在同时工作的不同硬件单元上。孤立地查看渲染简单事物的帧速率,您并没有有效地利用硬件。许多硬件将在相当长的一段时间内处于空闲状态。硬件的设计目的是在一次处理很多事情时实现最大吞吐量,而当你一次只给它一件或几件事情时,它的大部分能量都被浪费了。
正如您所注意到的,像孤岛危机这样的现代游戏设法在高端 GPU 上以 60 fps 的速度渲染非常复杂的场景。如果您有一个特定的场景,您正在尝试渲染或尝试在其中一个 GPU 上创建效果,那么它很可能足够快以满足您的需求,而无需您进行任何优化工作。如果您确实达到了性能成为场景问题的程度,那么可以使用 PIX、nvPerfHUD 等性能工具来跟踪和优化场景中的性能瓶颈。
简单地说——优化的游戏引擎在每帧做尽可能少的工作的同时推送尽可能多的数据。IMO,该示例的帧速率下降并不反映着色器/代码在 GPU/CPU 上工作的难度,而且该示例没有像你比较的引擎。
直接比较tessellation和pixel-push是错误的。现代游戏引擎通常会生成大量可以在 GPU 本身上看到的细节,这对帧速率很有好处。另外——当你在游戏世界中时,你不知道你能看到的那块“高度”镶嵌的岩石是精心制作的错觉,还是它实际上是由许多多边形组成的。
如果您要进行调整,我敢打赌 DX 样本也可以制作得非常快。但它将不再具有可读性——也不再是手头技术的纯粹说明。
另外,请注意,添加任务不会线性增加所花费的时间。尝试渲染两个表面。帧率下降多少?