首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何追踪VRAM和GTT内存泄漏?

如何追踪VRAM和GTT内存泄漏?
EN

Computer Graphics用户
提问于 2017-03-20 18:30:25
回答 2查看 1.6K关注 0票数 3

问题来了。我继承了一个大型的C++ 3D图形代码库(带有一些着色代码)。程序在崩溃前运行了大约1到5分钟。

问题数据。使用系统工具,人们可以看到VRAM内存使用量在程序启动后急剧上升,这将导致崩溃。GTT内存的使用情况也是如此(虽然峰值没有VRAM那么引人注目)。

问题.

  1. 这(可能)是否意味着某个地方的OpenGL着色代码中存在内存泄漏(而不是普通的C++代码中的内存泄漏)?
  2. 是否有著名的工具来跟踪vram/gtt内存泄漏(类似于val研可以用来跟踪系统内存使用情况的方式)?
EN

回答 2

Computer Graphics用户

发布于 2017-03-20 20:10:09

  1. 可能不会。大多数OpenGL资源(帧缓冲区、顶点缓冲区对象、纹理&c.)由主机代码(即C++代码)控制,但占用GPU内存。OpenGL并不能使管理这些资源变得非常容易,所以很可能是要创建这些资源,而不是从C++代码中删除它们。例如,它可能为每个帧创建一个新的VBO,但从不删除旧的VBO。
  2. 我从来没有为此目的使用过它,但是如果你在Windows上,我建议RenderDoc作为你的第一站。它不是专门为调试源代码而设计的--它拦截GL和DX调用,这样您就可以看到应用程序是如何使用库的,即使您没有源代码--所以它不会指向违规的代码行,但它确实显示了正在创建哪些资源以及何时创建,因此它至少应该告诉您什么是泄漏的,以及泄漏的频率。甚至可能是这些足够的信息足以让您猜测其余的信息,或者在此之后继续的最简单的方法是手工操作(例如,每次创建这样的资源时都打印__FILE____LINE__ )。

对不起,这是一个半截的回答,但太大了,不能发表评论。我希望它至少给你一个好的起点。

票数 3
EN

Computer Graphics用户

发布于 2017-03-23 17:11:24

假设您的代码有几个可以分配/释放GPU内存的位置,但是您不知道哪个位置泄漏。也许您可以尝试在代码中添加一个GPU内存监视器。

在代码中分配GPU内存时,在全局定义的数组中插入返回的缓冲区句柄、缓冲区大小、函数/文件名(甚至更好的是堆栈跟踪)。当GPU内存被释放时,删除从该数组释放的缓冲区句柄。运行应用程序一段时间,并在其崩溃之前退出。离开前输出数组的内容。它显示了有关未释放的GPU内存的信息。您可能会看到一些模式导致您了解如何修复“泄漏”。

票数 3
EN
页面原文内容由Computer Graphics提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://computergraphics.stackexchange.com/questions/4882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档