【问题标题】:Graphics Profiling图形分析
【发布时间】:2009-05-12 11:20:12
【问题描述】:

我有一个应用程序下降到大约 10fps。我使用 xperf 对其进行了分析,结果显示我的应用只使用了 20% 的 CPU,而我的任何方法都没有使用超过预期的 20%。

这似乎表明 fps 的大幅下降是因为显卡无法跟上渲染帧的速度,导致我的程序在赶上时停止...

有什么方法可以分析显卡的功能并计算出我的程序告诉它什么会减慢它的速度,以便我可以尝试提高帧速率?

【问题讨论】:

    标签: c++ graphics profiling direct3d


    【解决方案1】:

    要调试/分析图形,请尝试 Nvidia PerfHUD

    NVIDIA PerfHUD 是一款功能强大的 Direct3D 应用程序实时性能分析工具。

    还有一个 ATI 解决方案,称为“GPU PerfStudio”

    GPU PerfStudio 是一种实时性能分析工具,旨在帮助调整 DirectX 9、DirectX 10 和 OpenGL 应用程序的图形性能。 GPU PerfStudio 显示实时 API、驱动程序和硬件数据,这些数据可以使用极其灵活的绘图和条形图机制进行可视化。被分析的应用程序可以在本地或通过网络远程执行。 GPU PerfStudio 允许开发人员实时覆盖关键渲染状态,以实现快速瓶颈检测。自动分析窗口可用于识别图形管道各个阶段的性能问题。使用 GPU PerfStudio 无需特殊的驱动程序或代码修改。

    您可以在此处找到更多信息和下载链接:

    【讨论】:

    • 我有一张 ATI 卡,是否有可能以某种方式与 ATI 卡配合使用,或者 ATI 有自己的东西吗?
    • 好的,谢谢,我回家后检查一下,因为下载页面似乎是 https 并且我的大学网络似乎不允许 https :(
    【解决方案2】:

    另外,请查看这篇关于 FPS 的文章:

    FPS vs Frame Time

    基本上,它谈到了这样一个事实,即从 200fps 下降到 190fps 可以忽略不计,而从 30fps 下降到 20fps 则要大得多。为了更好地测量性能,您应该计算帧时间而不是 FPS。

    您根本没有告诉我们您的 fps 是多少或程序在做什么,所以您的“大跌”可能根本不是什么大问题。

    对于 DirectX,有 PIX 用于分析 CPU 和 GPU 操作。它可以提供非常详细的信息,可能值得研究。

    希望有帮助!

    【讨论】:

    • “我的应用程序降到了 10fps 左右”我认为在相当高端的计算机上达到 10fps 是一件大事……
    • 它没有下降 10 fps。它下降到 10 fps。绝对慢。
    【解决方案3】:

    您可以尝试使用 dxprof(在 google 中搜索)。它是一个轻量级的应用程序,可以实时绘制条形图,每个条形图对应一个 DirectX 事件(例如绘制调用或资源复制)。您可以冻结条形图并检查调用堆栈以找出绘制调用的来源。

    【讨论】:

      【解决方案4】:

      您是在为 Windows 开发吗?如果是这样,请避免使用 Video for Windows,因为这会限制您使用您描述的方式。请改用 DirectX。

      【讨论】:

      • 我正在使用 Direct3D,并且有一个功能强大的卡,所以我知道我的代码导致它以某种方式运行缓慢......
      • 您是从文件中流式传输视频。您是否也包括音频组件?
      【解决方案5】:

      无需猜测。只需在 IDE 下pause it a few times,它就会准确地显示它在等待什么。

      【讨论】:

      • 如何判断是哪个图形区域导致速度变慢?我很确定所有方法(如 DrawPrimitive 和 Unlock 等)几乎都会立即返回,需要在缓冲区中执行的 DirectX/GPU 粘贴工作,直到准备好执行此操作。如果我在清空缓冲区并完成包含的命令之前尝试开始一个新帧,那么程序必须等待?
      • @Lancer:它的工作方式很简单。假设它比它可能的速度慢,这意味着它在可能被淘汰的状态中花费了一小部分时间(比如说 50%)。状态主要由扩展程序计数器组成,即调用堆栈。因此,如果您对调用堆栈进行一次采样,那么您不会看到它做不必要的事情的机会是 50%。如果你采样 10 次,你不会看到它的机会是 1/1024。您将在大约 50% 的样本上看到它。现在也许它没有那么简单,但也许它是。祝你好运。
      • ... 如果您查看调用堆栈的每一层,您可能会发现一个函数调用出现在多个样本上,您从未想过会占用很多时间,但确实如此。如果您能弄清楚如何避免进行该调用,那么您将节省的时间近似为包含它的堆栈样本的分数。由于您报告速度很慢,这应该非常明显。
      • @Lancer:如果我添加到我之前的 cmets,请原谅我。也许,也许不是,您的代码正在等待 dX。如果是,堆栈示例将显示它这样做。然后可能是它的缓冲区发生缓慢,或者您调用它的频率超出了您的需要。在前一种情况下,您至少知道问题出在哪里。在后一种情况下,您会在堆栈中的某处看到可以较少执行的调用。如果样本显示您没有等待 dX,那么您将再次看到此类呼叫。如果你不这样做,那么你可能是完全最优的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 2017-04-21
      • 1970-01-01
      • 2016-08-23
      • 1970-01-01
      • 2011-09-02
      相关资源
      最近更新 更多