Sta*_*fan 10 linux opengl performance
这个标题很好地总结了我的问题:是否有适用于Linux的开源 OpenGL剖析器?
我唯一能找到的就是gDEBugger,但它只有7天的试用版,并且是非常封闭的来源.我会免费使用(如在自由中)软件开发,因此付费不是一种选择,尽管我可能会考虑接受免费(如在啤酒中)但关闭应用程序的答案.如果它适用于开源驱动程序(我的主计算机具有集成的英特尔显卡),则可获得奖励积分.
感谢@ 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"
}
}
Run Code Online (Sandbox Code Playgroud)
现在使用以下命令运行程序:
BUGLE_CHAIN=showcalltimes LD_PRELOAD=libbugle.so <your-program>
Run Code Online (Sandbox Code Playgroud)
这将打印每帧每个GL功能所花费的平均时间.这本身并不是非常有用,因为对于像glVertex
每次调用数千次的调用,它可能会显示为0.00ms,即使累积时间非常重要.所以添加一个新条目statistics
:
"total time per call" = d("calls:*") / d("calls:*") * d("calltimes:*") / d("frames") * 1000
{
precision 3
label "* (ms)"
}
Run Code Online (Sandbox Code Playgroud)
我使用与"每帧调用"统计数据相同的技巧:乘以并除以d("calls:*")
对任何从未调用的函数引起除零错误,以避免对所有不相关的函数显示0.00.
现在,返回showcalltimes
我们添加的链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"
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们将看到每帧每个函数花费的总时间的有用统计数据.如果你想在很多帧上平均这些统计数据,取消注释key_accumulate
上面的行,然后你可以点击"A"(或将其重新映射到你选择的键)以开始累积.随着时间的推移,你会看到统计数据停止跳动,因为它们平均超过许多帧.
您还可以使用此链将这些统计信息记录到输出文件中:
chain logcalltimes
{
filterset stats_calls
filterset stats_calltimes
filterset log
{
filename "bugle.log"
}
filterset logstats
{
show "total time per call"
}
}
Run Code Online (Sandbox Code Playgroud)
这很难理解,因为它只是将每个帧的各个统计数据一个接一个地放在一起,而且我还没有找到一种方法来随时间平均它们.所以我读取统计数据的首选方法是showcalltimes
打开累加器的链.