在析构函数调用期间,glDeleteBuffers崩溃

glDeleteBuffers crashes during destructor call

本文关键字:glDeleteBuffers 崩溃 析构 函数调用      更新时间:2023-10-16

嗨,我使用VBO加载图像纹理,然后在c++中绘制。VBO id生成,绑定和绘制发生在这里

void ViewManager::render(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
if(decompressTileImage->tileTexure == 0)
    {
        loadTexture(decompressTileImage);
        glGenBuffers(1,&decompressTileImage->VBOId);
        glBindBuffer(GL_ARRAY_BUFFER,decompressTileImage->VBOId);
        glBufferData(GL_ARRAY_BUFFER,sizeof(*(this->tileCoordList))+sizeof(*(this->tileTextureCoordList)),0,GL_STATIC_DRAW);
        glBufferSubData(GL_ARRAY_BUFFER,0,sizeof(*(this->tileCoordList)),this->tileCoordList);
        glBufferSubData(GL_ARRAY_BUFFER,sizeof(*(this->tileCoordList)),sizeof(*(this->tileTextureCoordList)),this->tileTextureCoordList);
    }
    else
    {
        glBindBuffer(GL_ARRAY_BUFFER,decompressTileImage->VBOId);
        glBindTexture(GL_TEXTURE_2D, decompressTileImage->tileTexure);
    }
    glColor4f(1.0f, 1.0f, 1.0f, textureAlpha);
    if(textureAlpha < 1.0)
    {
        textureAlpha = textureAlpha + .03;
        this->tiledMapView->renderNow();
    }
glTexCoordPointer(3, GL_FLOAT, 0, (void*)sizeof(*(this->tileCoordList)));
glVertexPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glBindBuffer(GL_ARRAY_BUFFER,0);
glDisable(GL_BLEND);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
}

这个函数在一个名为MapTile的类中。MapTile为从互联网下载的35个图像创建35次。然后一个线程为35个MapTile对象调用这个方法35次,并一直这样做。这就是为什么我首先检查该方法是否第一次被调用,以便我可以加载数据并为每个MapTile对象仅生成一次VBO id。我用if(decompressTileImage->tileTexure == 0)检查这一行。然后每次绑定vbo id到draw。不需要重新加载数据

这里decompressTileImageTextureImageInfo类。实现是

#include "TextureImageInfo.h"
TextureImageInfo::TextureImageInfo(unsigned char * image,GLuint format,int texWidth,int texHeight,int imageWidth,int imageHeight,float tex_x,float tex_y)
{
// TODO Auto-generated constructor stub
this->format = format;
this->image = image;
this->imageHeight = imageHeight;
this->imageWidth = imageWidth;
this->texHeight = texHeight;
this->texWidth = texWidth;
this->tileTexure = 0;
this->VBOId = 0;
this->time = 0;
}
TextureImageInfo::~TextureImageInfo()
{
if(VBOId!=0)
    glDeleteBuffers(1,&VBOId);
}

它绘制并做一切都很好,但当我试图在这里给出的TextureImageInfo类的析构函数中清理内存时崩溃。我不明白为什么。我检查了VBOId是否生成并加载到内存中,并且在析构函数中也使用if条件。

如注释所示,OpendGL ES命令应该从创建上下文的同一线程提交。

来自黑莓文档与OpenGL ES并行处理:

重要的是要注意每个OpenGL ES渲染上下文目标一个执行线程。

如果你想渲染多个场景,你可以把每个场景分开到自己的线程中,确保每个线程都有自己的上下文