【问题标题】:How can I predict how HLSL shaders affect performance?如何预测 HLSL 着色器如何影响性能?
【发布时间】:2012-05-29 22:11:17
【问题描述】:

例如,如果我渲染一个平面,我会得到 1500 帧/秒。使用简单的混合贴图,帧率会下降到 700(双倍帧率下降?!)。在 Microsoft DirectX SDK 示例中“视差遮挡”映射“模型很小,不超过 200 个顶点圆,但帧率下降到 400。让我感到困惑的是,像孤岛危机这样的游戏结合了所有最新和最重的着色器效果(镶嵌比视差映射重得多) ,是的,我可以在超设置下达到 50 FPS。这比 SDK 示例少 6 倍,但 Crysis 在屏幕上渲染数十万个顶点 + 效果比 SDK 示例多倍。

【问题讨论】:

    标签: performance directx shader direct3d hlsl


    【解决方案1】:

    简单地说——优化的游戏引擎在每帧做尽可能少的工作的同时推送尽可能多的数据。 IMO,该示例的帧速率下降并不是反映着色器/代码在 GPU/CPU 上工作的难度,而是该示例没有像您比较的引擎。

    直接比较tessellation和pixel-push是错误的。现代游戏引擎通常会生成大量可以在 GPU 本身上看到的细节,这对帧率很有好处。另外 - 当您在游戏世界中时,您不知道您所看到的“高度”镶嵌的岩石是否是精心制作的错觉,或者它是否确实由许多多边形组成。

    如果您要进行一些调整,我敢打赌 DX 样本也可以制作得非常快。但它将不再具有可读性 - 也不再是手头技术的纯粹说明。

    另外,请注意,添加任务不会线性增加所花费的时间。尝试渲染两个表面。帧率下降了多少?

    【讨论】:

    • 嗯,可读性是什么意思,我的意思是这些例子非常简短,简单明了,还有什么可以优化的......
    • 它会在一次绘制调用中推送所有数据吗?它会在每次渲染之前切换渲染状态吗?它是否在每次渲染之前优化着色器参数集?是否根据 LOD 获取数据?它是否优化了在像素着色器中执行的计算?这样的事情加起来。
    • 好的,我知道这可能要求很多,但是您能否指出 1 或 2 个可以优化此 HLSL 的地方?举个例子,我会更容易开始掌握窍门其中:D 这里是:text-upload.com/read.php?id=381529&c=1374616
    【解决方案2】:

    在这样一个简单的示例中查看帧速率并不是一个非常有意义的性能衡量标准。 DirectX 旨在为您以 60 fps 左右的每帧渲染大量几何图形的类似游戏的工作负载提供高效,而不适用于您以 100 或 1000 fps 的速度渲染非常简单的几何图形的合成测试。基于像这样单独测量帧速率,您无法推断出关于渲染特定对象的相对性能的任何非常有用的信息。软件和硬件旨在实现 16.6 毫秒帧的最大吞吐量,而不是最小延迟。

    在查看 DirectX 性能时,您需要记住很多事情是并行进行的。在典型的游戏中,CPU 将在 GPU 渲染第 n-1 帧时为第 n 帧发出绘制命令。 GPU 管道可能会为来自一个绘制调用的三角形着色像素,同时对来自不同调用的三角形进行光栅化,并处理来自另一个调用的顶点,所有这些都在同时工作的不同硬件单元上。孤立地查看渲染简单事物的帧速率,您并没有有效地利用硬件。许多硬件将在相当长的一段时间内处于空闲状态。硬件的设计目的是在一次处理很多事情时实现最大吞吐量,而当您一次只给它处理一件或几件事情时,它的大部分功率就会被浪费。

    如您所见,像孤岛危机这样的现代游戏设法在高端 GPU 上以 60 fps 的速度渲染非常复杂的场景。如果您有一个特定的场景,您正在尝试渲染或尝试在其中一个 GPU 上创建效果,那么它很可能会足够快以满足您的需求,而无需您进行任何优化工作。如果您确实达到了性能成为场景问题的程度,那么可以使用 PIX、nvPerfHUD 等性能工具来跟踪和优化场景中的性能瓶颈。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多