我要发帖 回复

正式会员

9

主题

46

积分

0

专家分

:

私信
发表时间 : 2008-9-9 16:15:25 | 浏览 : 2815    评论 : 8
BOOL CTexture::LoadGLTextures(GLuint *texPntr, char* name)
{
BOOL success = FALSE;
AUX_RGBImageRec *TextureImage[1];
memset(TextureImage,0,sizeof(void *)*1); // 将指针设为 NULL
FILE* test=NULL;
if (!name) // 确保文件名已提供
{
  MessageBox(NULL,"纹理图片文件ming","出错",MB_OK);
  return NULL; // 如果没提供,返回 NULL
}
test = fopen(name, "r");
if (test != NULL) {
  fclose(test);
  TextureImage[0] = auxDIBImageLoad(name);
}
else
{
  MessageBox(NULL,"纹理图片文件不存在","出错",MB_OK);
  return success;
}
if (TextureImage != NULL) {
  success = TRUE;  
  glGenTextures(1, texPntr); // 生成纹理1
  glBindTexture(GL_TEXTURE_2D, *texPntr);// 邦定纹理
  glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB,
   GL_UNSIGNED_BYTE, TextureImage[0]->data);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
}
if (TextureImage[0]) // 纹理是否存在
{
  if (TextureImage[0]->data) // 纹理图像是否存在
  {
   free(TextureImage[0]->data); // 释放纹理图像占用的内存
  }
  free(TextureImage[0]); // 释放图像结构
}
return success;
}



这是类 CTexture的成员函数,用于加载纹理图片。

然后我在另一个类CBezier的成员函数CBezier::Draw中创建了上述类的对象,并调用上面的函数LoadGLTextures。

然后在MFC框架View类的onDraw函数中创建了CBezier类对象bz,并用此对象调用bz.Draw();
得到了一张贴有纹理的Bezier曲面,但是只要我改变窗口大小,或转动曲面,内存就会增加,一直累加上去。

只要不调用上诉函数,就不会出现这种情况。

感觉象是内存泄漏,但是没找的解决办法。
哪位大侠帮忙看看!在线等!!!!!

最近VR访客

meiguihujian 评论于2008-9-9 19:14:43
用Boundscheck报告是resources leak
资源泄漏了
但是还是看不出哪里有问题
meiguihujian 评论于2008-9-9 19:34:01
忽忽!!
终于自己解决了
原来我在CBezier类中用了一个的结构体,结构体中有纹理对象数组和一个存储显示列表的变量。而在类中我只是生成了纹理对象和现实列表,存储在上述结构体中,但是并没有删除纹理对象和显示列表的操作。
所以我在CBezier类的析构函数中增加了
glDeleteTextures(1, mystruct . texture);
glDeleteLists(mystruct . lists, 1);
内存不再增加。
tan_dunming 评论于2008-9-9 19:57:12
“然后在MFC框架View类的onDraw函数中创建了CBezier类对象bz,并用此对象调用bz.Draw();
得到了一张贴有纹理的Bezier曲面,但是只要我改变窗口大小,或转动曲面,内存就会增加,一直累加上去。

只要不调用上诉函数,就不会出现这种情况。”


怎么会“改变窗口大小,或转动曲面”? 莫非你在每一次绘制的时候都重新生成一个CBezier对象还是纹理的结构体?也就是说该对象或者说CTexture对象是一个局部变量?否则不会在重绘的时候重新生成纹理的。

你再仔细看看,虽然现在不占用内存的问题解决了,但是是不是每一次重绘的时候又重复读取纹理图片呢?这样也不够合理啊,应该是初始化读取,结束时候释放。注意是不是每次都是用局部变量造成的问题。
追求卓越
meiguihujian 评论于2008-9-10 17:30:56

回复 4楼 的帖子

你所说的初始化读取是什么意思啊?
我在CBezier类构造函数里创建CTexture对象
tan_dunming 评论于2008-9-10 22:59:21
那是不是CBezier类的对象会生成好多次呢? “改变窗口大小,或转动曲面”就会调动绘制函数,在绘制函数中是否会每次生成一个CBezier的对象呢? 这只是我的猜测, 也不一定吧。 你感兴趣的话研究研究,或者附上代码。可能是我理解错了,也许无关紧要吧。 也许您已经修改好了。
追求卓越
meiguihujian 评论于2008-9-12 11:02:38

回复 6楼 的帖子

在绘制函数中定义的对象
它也只是个局部的对象
绘制函数结束了,它也析构了,占有的资源也就释放了啊
tan_dunming 评论于2008-9-12 19:35:25
对的 我的意思是 每次绘制 这样都读取硬盘中的文件 可以读取一次 然后记录下来 如果每次都读取影响效率 其它没什么意思
追求卓越
meiguihujian 评论于2008-9-13 00:00:18
很好的提醒呵呵
谢了

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-4-18 11:02 PM

返回顶部