标题很好地总结了我的问题:是否有适用于Linux的开源 OpenGL分析器?
我唯一能找到的是gDEBugger,但它只有7天的试用期,并且是非常封闭的来源。我会免费使用(如在自由中)软件开发,因此付费不是一种选择,尽管我可能会考虑接受免费(如在啤酒中)但关闭应用程序的答案。如果它适用于开源驱动程序(我的主计算机具有集成的英特尔图形卡),则可获得奖励积分。
答案 0 :(得分:9)
感谢@ cypheon的回答,我检查了BuGLe。这太棒了,但我不得不花一点时间来获得有用的分析输出。我想将此添加为对该答案的评论,但我确实需要粘贴完整的代码示例,以便我开始一个新的答案。
正如他所建议的那样,stats_calltimes过滤器适合分析 - 不理想(因为它不显示调用堆栈信息),但通过一些工作,它可以显示总的平坦时间每帧每个GL功能。
您需要同时修改~/.bugle/filters
和~/.bugle/statistics
个文件。首先,将此链添加到filters
:
chain showcalltimes
{
filterset stats_calls
filterset stats_calltimes
filterset showstats
{
show "average time per call"
}
}
现在使用以下命令运行程序:
BUGLE_CHAIN=showcalltimes LD_PRELOAD=libbugle.so <your-program>
这将打印每帧每个GL功能所花费的平均时间。这本身并不是非常有用,因为对于像glVertex
这样的调用,每帧调用数千次,即使累积时间非常重要,它也可能显示为0.00ms。因此,请向statistics
添加新条目:
"total time per call" = d("calls:*") / d("calls:*") * d("calltimes:*") / d("frames") * 1000
{
precision 3
label "* (ms)"
}
我使用与“每帧调用”统计数据相同的技巧:乘以d("calls:*")
乘以导致从未调用的任何函数的除零错误,以避免显示所有的无关的功能。
现在,返回我们添加到showcalltimes
的{{1}}链,并将filters
更改为"average time per call"
:
"total time per call"
现在我们将看到每帧每个功能花费的总时间的有用统计数据。如果您想要在多个帧中平均这些统计数据,请取消注释上面的chain showcalltimes
{
filterset stats_calls
filterset stats_calltimes
filterset showstats
{
show "total time per call"
#key_accumulate "A"
#key_noaccumulate "I"
}
}
行,然后您可以点击“A”(或将其重新映射到您选择的键)以开始累积。随着时间的推移,你会看到统计数据停止跳动,因为它们在很多帧上平均。
您还可以使用此链将这些统计信息记录到输出文件中:
key_accumulate
这很难理解,因为它只是将每个帧的各个统计数据一个接一个地放在一起,而且我还没有找到一种方法来对它们进行平均。因此,我首选的读取统计数据的方法是chain logcalltimes
{
filterset stats_calls
filterset stats_calltimes
filterset log
{
filename "bugle.log"
}
filterset logstats
{
show "total time per call"
}
}
链,并且累加器已打开。
答案 1 :(得分:6)
答案 2 :(得分:1)
答案 3 :(得分:1)
答案 4 :(得分:-1)
我也很喜欢vogl--请在https://github.com/ValveSoftware/vogl
查看它具有分析,捕获和重放 - 但杀手功能是帧捕获,您可以通过重放捕获的状态来检查所有缓冲区,着色器变量等。