<分区>
标题很好地总结了我的问题:是否有用于 Linux 的开源 OpenGL 分析器?
我唯一能找到的是 gDEBugger , 但它只有 7 天的试用期,而且是非常封闭的源代码。我会免费(如自由)软件开发使用它,因此付费不是一种选择,尽管我可能会考虑接受免费(如啤酒)但封闭的应用程序的答案。如果它适用于开源驱动程序(我的主计算机有一个集成的 Intel 显卡),则加分。
<分区>
标题很好地总结了我的问题:是否有用于 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。
现在,回到我们添加到 filters
的 showcalltimes
链,并将 "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++ - 如何应对缓慢的 vector<string> 析构函数?
c++ - 在 gDebugger 中运行我的程序时出现奇怪的结果
c - linux 中 pthread_create 中的 'arg'
linux - 在 Shell 脚本目录中的文件夹数组中并显示每个文件夹中的文件,重命名/删除选项
linux - BASH:如何检测最后进入目录的文件? (不是时间戳)
c++ - 使用 glReadPixels(...) 读取帧缓冲区时精度较低
performance - Perl:切片数组,而不创建一个全新的数组