delete вызывает деструктор конечно, но из памяти видеокарты текстура не удаляется. То есть ее похоже через deleteTexture надо.
Но все равно не понятно, почему вдруг буфер хранится в оперативной памяти? Он же должен быть в памяти видеокарты.
Более того обнаружил, что в памяти видеокарты этот буфер занимает в два раза больше положенного объема. То есть размер буфера я считаю так:
n*m*sizof(pixel) = 4096*4096*4 = 67 метров
Буфер занимает в оперативной памяти 67 метров и в памяти видеокарты 134. Вот как так? Получается для него создается еще один буфер кадра?
Приведу код по подробнее:
cppMap::Map(QGLWidget *widget): gl(widget){
width = 0;
height = 0;
fbo = NULL;
map = NULL;
}
Map::~Map(){
deleteMap();
}
void Map::deleteMap(){
for (int i=0; i<width; i++)
delete[] map[i];
delete[] map;
delete fbo;
}
void Map::createMap(QImage &tex){
Color *pix = (Color*)tex.bits();
map = new HalfChar*[width];
for (int i=0; i<width; i++){
map[i] = new HalfChar[height];
for (int j=0; j<height; j++){
if (pix[j*width+i].a>127)
map[i][j].d = 1;
else
map[i][j].d = 0;
map[i][j].id = 0;
}
}
}
void Map::createFbo(int texMapId){
fbo = new QGLFramebufferObject(width, height);
fbo->bind();
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, height, 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClearColor(1, 1, 1, 0);
glClear(GL_COLOR_BUFFER_BIT);
gl->drawTexture(QPoint(0, 0), texMapId);
fbo->release();
gl->deleteTexture(texId);
texId = fbo->texture();
}
void Map::loadMap(QString path){
deleteMap();
QImage mapTex;
if (!mapTex.load(path))
Debug::warning("load map is faled");
width = mapTex.width();
height = mapTex.height();
int maxMapSize = width>height ? width : height;
int maxTexSize;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTexSize);
if (maxMapSize>maxTexSize)
Debug::warning("map is too large (map size: "+
QString::number(maxMapSize)+
", max texture size:"+
QString::number(maxTexSize)+")");
createMap(mapTex);
createFbo(gl->bindTexture(mapTex)); //вот тут RAM+67m, DRAM+134m
}
hclass Map{
QGLWidget *gl;
void createMap(QImage &tex);
void createFbo(int texId);
void deleteMap();
public:
Map(QGLWidget *widget);
~Map();
void loadMap(QString path);
Point pos;
QGLFramebufferObject *fbo;
HalfChar **map;
int width, height;
int texId;
QImage mapTex;
};
PS Qt 4.8.0, kubuntu 12.04.1, видеокарта от nvidia - там можно просмотреть объем занимаемой памяти