Russian Qt Forum
Ноябрь 23, 2024, 18:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QGLFramebufferObject в оперативной памяти?  (Прочитано 3421 раз)
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« : Сентябрь 20, 2012, 18:55 »

Создаю QGLFramebufferObject. Он помещается в оперативную память видео карты. Но и в обычной оперативной памяти тоже остается. Почему? Он мне тут не нужен, пусть в видеокарточке сидит Улыбающийся
И второй вопрос: как правильно его удалить? Создаю так:

Код:
fbo = new QGLFramebufferObject(width, height);

Удаляю так:

Код:
delete fbo;

Но останется ли при таком удалении буфер в видеопамяти?
Записан
RomanKravchenko
Гость
« Ответ #1 : Сентябрь 21, 2012, 12:33 »

Вроде как, это буфер оперативной памяти. В видеокарте сидит только текстура. А почему не удалять деструктором?

QGLFramebufferObject::~QGLFramebufferObject () [virtual]
Destroys the framebuffer object and frees any allocated resources.
Записан
mutineer
Гость
« Ответ #2 : Сентябрь 21, 2012, 12:42 »

А почему не удалять деструктором?

А delete разве не вызывает деструктор?
Записан
RomanKravchenko
Гость
« Ответ #3 : Сентябрь 21, 2012, 13:07 »


А delete разве не вызывает деструктор?

Ок. Тогда все понятно.
Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« Ответ #4 : Сентябрь 21, 2012, 13:21 »

delete вызывает деструктор конечно, но из памяти видеокарты текстура не удаляется. То есть ее похоже через deleteTexture надо.
Но все равно не понятно, почему вдруг буфер хранится в оперативной памяти? Он же должен быть в памяти видеокарты.
Более того обнаружил, что в памяти видеокарты этот буфер занимает в два раза больше положенного объема. То есть размер буфера я считаю так:
n*m*sizof(pixel) = 4096*4096*4 = 67 метров
Буфер занимает в оперативной памяти 67 метров и в памяти видеокарты 134. Вот как так? Получается для него создается еще один буфер кадра?
Приведу код по подробнее:
cpp
Код:
Map::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
}
h
Код:
class 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 - там можно просмотреть объем занимаемой памяти
« Последнее редактирование: Сентябрь 21, 2012, 13:30 от Torvald » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 23.