图形性能分析

6
我有一个应用程序,帧率会降到约10fps。我使用xperf对其进行了分析,结果显示我的应用程序仅使用了20%的CPU,而我的方法中没有任何一个占用了超过这20%的预期数量。
这似乎表明,fps急剧下降是因为显卡无法跟上渲染帧速度,导致我的程序停止,直到它赶上为止...
是否有一种方法可以对显卡进行分析,找出我的程序在告诉它做什么方面存在性能瓶颈,以便我尝试提高帧率?
5个回答

7

如果需要调试/分析图形方面的问题,可以尝试使用Nvidia PerfHUD。

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

还有一种名为“GPU PerfStudio”的ATI解决方案。

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

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


我有一张ATI显卡,有没有可能它能在ATI显卡上运行或者ATI有自己的东西? - Fire Lancer
好的,谢谢。我回家后会查看它,因为下载页面似乎是https,而我的学校网络似乎不允许https :( - Fire Lancer

4
此外,看看这篇FPS文章:FPS vs Frame Time。基本上它谈到了从200fps到190fps的下降是可以忽略不计的,而从30fps到20fps的下降则是一个更大的问题。为了更好地测量性能,您应该计算帧时间而不是FPS。
您从未告诉我们您的fps是多少或程序在做什么,因此您的“巨大下降”可能根本不是什么大事。
对于DirectX,有PIX用于分析CPU和GPU操作。它可以提供非常详细的信息,值得一试。
希望这有所帮助!

1
我有一个应用程序,帧率降至约10fps。我认为在一台相当高端的电脑上,10fps是值得大惊小怪的事情... - Fire Lancer
它不是下降了10帧。它下降到了10帧。肯定很慢。 - Joe

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

0

您是否正在开发Windows应用程序?如果是,请避免使用Video for Windows,因为它会限制您的描述方式。请改用DirectX。


我正在使用Direct3D,并且我的显卡相当强大,所以我知道我的代码在某种程度上导致它运行缓慢... - Fire Lancer
你正在从文件中流式传输视频吗?你也包含音频组件吗? - ChrisBD

0
不需要猜测。只需在IDE下暂停几次,它就会准确地告诉你它正在等待什么。

那怎么判断哪个图形区域导致了减速呢?我很确定像DrawPrimitive和Unlock等所有方法都会立即返回,而DirectX/GPU会将需要处理的工作放入缓冲区直到准备好执行。然后程序必须等待,如果在它们清空缓冲区并完成其中包含的命令之前尝试启动新帧? - Fire Lancer
@Lancer:它的工作方式很简单。假设它比可能的速度慢,那就意味着它在某些状态下花费了一定的时间(比如说50%),而这些状态是可以被消除的。这些状态主要由扩展程序计数器组成,即调用堆栈。因此,如果你对调用堆栈进行一次采样,你不会看到它执行不必要的操作的概率为50%。如果你采样10次,你不会看到它执行不必要的操作的概率为1/1024。你将在大约50%的样本中看到它。现在也许事情没有那么简单,但也许确实如此。祝你好运。 - Mike Dunlavey
如果你查看调用堆栈的每一层,你可能会发现一个函数调用在多个样本中出现,而你从未想过它会占用很多时间,但实际上确实如此。如果你能够找出避免进行该调用的方法,你将节省的时间大约等于包含它的堆栈样本的比例。既然你报告了严重的缓慢,那么这应该非常显然。 - Mike Dunlavey
@Lancer:如果我在之前的评论中添加了一些内容,请原谅我。也许,或者也许不是,你的代码正在等待dX。如果是这样,堆栈样本将显示它正在执行该操作。那么,它可能是在其缓冲区中发生缓慢,或者你调用它的频率比你需要的要高。在前一种情况下,你至少知道问题出在哪里。在后一种情况下,你会在堆栈的某个地方看到可以更少调用的调用。如果样本显示你没有等待dX,那么你会再次看到这样的调用。如果没有,那么你可能已经完全优化了。 - Mike Dunlavey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接