linux - 用于 Linux 的开源 OpenGL 分析器

标签 linux opengl performance

<分区>

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

我唯一能找到的是 gDEBugger , 但它只有 7 天的试用期,而且是非常封闭的源代码。我会免费(如自由)软件开发使用它,因此付费不是一种选择,尽管我可能会考虑接受免费(如啤酒)但封闭的应用程序的答案。如果它适用于开源驱动程序(我的主计算机有一个集成的 Intel 显卡),则加分。

最佳答案

感谢@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.00 毫秒,即使累积时间非常长。因此,向 statistics 添加一个新条目:

"total time per call" = d("calls:*") / d("calls:*") * d("calltimes:*") / d("frames") * 1000
{
    precision 3
    label "* (ms)"
}

我使用了与“每帧调用”统计数据相同的技巧:乘以和除以 d("calls:*") 以导致任何函数被零除错误从未调用过,以避免为所有不相关的函数显示 0.00。

现在,回到我们添加到 filtersshowcalltimes 链,并将 "average time per call" 更改为 "每次通话的总时间”:

chain showcalltimes
{
    filterset stats_calls
    filterset stats_calltimes
    filterset showstats
    {
        show "total time per call"
        #key_accumulate "A"
        #key_noaccumulate "I"
    }
}

现在我们将看到每帧在每个函数中花费的总时间的有用统计数据。如果你想在许多帧上平均这些统计数据,取消注释上面的 key_accumulate 行,然后你可以点击“A”(或将其重新映射到你选择的键)开始累积。随着时间的推移,您会看到统计数据不再跳来跳去,因为它们会在许多帧上取平均值。

您还可以使用此链将这些统计信息记录到输出文件中:

chain logcalltimes
{
    filterset stats_calls
    filterset stats_calltimes
    filterset log
    {
        filename "bugle.log"
    }
    filterset logstats
    {
        show "total time per call"
    }
}

这很难读懂,因为它只是将每一帧的各个统计数据一个接一个地放在一起,而且我还没有找到一种方法来计算它们随时间变化的平均值。因此,我首选的读取统计信息的方法是打开累加器的 showcalltimes 链。

关于linux - 用于 Linux 的开源 OpenGL 分析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3235864/

相关文章:

c++ - 计算紧密正交投影矩阵以进行阴影映射

c++ - 如何应对缓慢的 vector<string> 析构函数?

c++ - 在 gDebugger 中运行我的程序时出现奇怪的结果

c - linux 中 pthread_create 中的 'arg'

linux - 在 Shell 脚本目录中的文件夹数组中并显示每个文件夹中的文件,重命名/删除选项

linux - BASH:如何检测最后进入目录的文件? (不是时间戳)

c++ - 使用 glReadPixels(...) 读取帧缓冲区时精度较低

performance - Perl:切片数组,而不创建一个全新的数组

c# - 如果使用的库不支持异步等待,在哪里使用 Task.Run

linux - 编写 bash 脚本来更改文本并写入日志