如何在 C++ 和 OpenGL 中分析我自己的函数?

Posted

技术标签:

【中文标题】如何在 C++ 和 OpenGL 中分析我自己的函数?【英文标题】:How to profile my own functions in C++ and OpenGL? 【发布时间】:2011-05-05 18:30:36 【问题描述】:

在 C++/OpenGL 中有什么简单易行的函数分析方法吗?我能找到的只有 gDEBugger。浏览文档我找不到做我想做的事的方法。让我解释一下……

正如我在其他问题中所说,我有一个防御塔游戏。目前它们只有 3 个,但这个数字是可配置的。我对所有的塔都有一个绘制函数(这个函数可能会调用其他函数,没关系),我想分析这个函数(对于 3 个塔,然后再次增加数量和配置文件)。然后我想为塔实现显示列表,进行相同的分析,看看在这种特定情况下使用显示列表是否有任何好处。

对于这样的任务,您推荐什么分析工具?如果重要的话,我正在使用 Visual Studio 10 在 Windows 上编写 OpenGL。或者这可以使用 gDEBugger 来完成吗?有什么指点吗?

P.S:我知道在 OpenGL 3.1 上删除了显示列表,但以上只是一个示例。

【问题讨论】:

【参考方案1】:

NVidia 有一个,AMD 也有。对于Intel。

对于粗粒度监控,您可以测量从开始到缓冲区交换后执行帧所需的时间或glFlush()/glFinish()

while( running )

    start_time = GetTimeInMS();

    RenderFrame();
    SwapGLBuffers();

    end_time = GetTimeInMS();

    cout << "Frame time (ms): " << (end_time - start_time) << end;

【讨论】:

为了完整性,Imagination Technologies 也是如此(用于大多数嵌入式设备) 只能从头到尾进行缓冲交换吗?我不想测量RenderFrame,而是该函数内部的特定渲染。 @Nazgulled:OpenGL 调用通常由驱动程序排队,并且只有在某些情况下才会在 GPU 和 CPU 之间进行同步。例如,从在 FBO 中渲染到的纹理中读取。调用 glFinish() 会强制执行这种同步,但它只会告诉您所有绘图命令以及影响这些绘图的任何先前调用都已完成。 所以我最好评论所有其他的绘图功能,然后只为我想要的时间?

以上是关于如何在 C++ 和 OpenGL 中分析我自己的函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中获取 OpenGL 使用的总内存(以字节为单位)?

使用性能记录分析 linux 应用程序

如何在 C++ 中分析和捕获双重删除和内存损坏

如何在 Coverity 中使用 xcodebuild?

如何开始在 openGL 和 C++ 中构建cooliris?

如何在 C# 中释放在 C++ 中分配的内存