适用于Linux的开源OpenGL分析器

Sta*_*fan 10 linux opengl performance

这个标题很好地总结了我的问题:是否有适用于Linux的开源 OpenGL剖析器?

我唯一能找到的就是gDEBugger,但它只有7天的试用版,并且是非常封闭的来源.我会免费使用(如在自由中)软件开发,因此付费不是一种选择,尽管我可能会考虑接受免费(如在啤酒中)但关闭应用程序的答案.如果它适用于开源驱动程序(我的主计算机具有集成的英特尔显卡),则可获得奖励积分.

mgi*_*uca 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"
    }
}
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打开累加器的链.


cyp*_*eon 6

看看BuGLe.它的主要目标不是分析,但它有一个过滤器,显示每个OpenGL调用所花费的时间.