Поскольку развивается только размер окна, нормально ли моей программе требуется одно полное ядро для рендеринга сцены в развернутом окне?
Я использую Qt 4.7 на языке C ++ для окон, чтобы нарисовать 150 изображений (компоненты RGBA, каждый в байте) этих размеров: 1754 * 1240.
Я загружаю свои текстуры так:
glGenFramebuffers(TDC_NB_IMAGE, _fborefs);
glBindFramebuffer(GL_FRAMEBUFFER, _fbo);
//initialize tex
glGenTextures(TDC_NB_IMAGE, _picrefs);
for (int i = 0 ; i < TDC_NB_IMAGE ; i++)
{
qDebug() << "loading texture num : " << i;
_pics[i].scale = 1.f;
_pics[i].pos.rx() = i % ((int)sqrt((float)TDC_NB_IMAGE));
_pics[i].pos.ry() = i / ((int)sqrt((float)TDC_NB_IMAGE));
_pics[i].text.load("imgTest.png");
glBindTexture(GL_TEXTURE_2D, _picrefs[i]);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);//GL_LINEAR_MIPMAP_LINEAR
glTexImage2D (GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,
TDC_IMG_WIDTH, TDC_IMG_HEIGHT, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE,
_pics[i].text.toImage().bits()
);
//glGenerateMipmap(GL_TEXTURE_2D);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _picrefs[i], 0);
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
Я рисую свою сцену так:
glBindFramebuffer(GL_FRAMEBUFFER, _fbo);
glClear( GL_COLOR_BUFFER_BIT);
//for each image
for (int i = 0 ; i < TDC_NB_IMAGE ; i++)
{
//compute coords
if (_update)
{
//pos on 0,0
_pics[i].quad.topleft.rx() = 0;
_pics[i].quad.topleft.ry() = 0;
_pics[i].quad.topright.rx() = TDC_IMG_WIDTH;
_pics[i].quad.topright.ry() = 0;
_pics[i].quad.botright.rx() = TDC_IMG_WIDTH;
_pics[i].quad.botright.ry() = TDC_IMG_HEIGHT;
_pics[i].quad.botleft.rx() = 0;
_pics[i].quad.botleft.ry() = TDC_IMG_HEIGHT;
//translate
QPointF dec(0, 0);
dec.rx() = _pics[i].pos.x() * TDC_IMG_WIDTH + _pics[i].pos.x() * TDC_SPACE_IMG;
dec.ry() = _pics[i].pos.y() * TDC_IMG_HEIGHT + _pics[i].pos.y() * TDC_SPACE_IMG;
_pics[i].quad.topleft += dec;
_pics[i].quad.topright += dec;
_pics[i].quad.botright += dec;
_pics[i].quad.botleft += dec;
//scale
_pics[i].quad.topleft *= _globalScale;
_pics[i].quad.topright *= _globalScale;
_pics[i].quad.botright *= _globalScale;
_pics[i].quad.botleft *= _globalScale;
_update = false;
}
//prepare tex drawing
//draw drawing area
glBindTexture (GL_TEXTURE_2D, 0);
glBegin (GL_QUADS);
glTexCoord2f (0.0, 0.0);glVertex3f (_pics[i].quad.topleft.x(), _pics[i].quad.topleft.y(), 0);
glTexCoord2f (1.0, 0.0);glVertex3f (_pics[i].quad.topright.x(), _pics[i].quad.topright.y(), 0);
glTexCoord2f (1.0, 1.0);glVertex3f (_pics[i].quad.botright.x(), _pics[i].quad.botright.y(), 0);
glTexCoord2f (0.0, 1.0);glVertex3f (_pics[i].quad.botleft.x(), _pics[i].quad.botleft.y(), 0);
glEnd();
//draw texture
glBindTexture (GL_TEXTURE_2D, _picrefs[i]);
glBegin (GL_QUADS);
glTexCoord2f (0.0, 0.0);glVertex3f (_pics[i].quad.topleft.x(), _pics[i].quad.topleft.y(), 0);
glTexCoord2f (1.0, 0.0);glVertex3f (_pics[i].quad.topright.x(), _pics[i].quad.topright.y(), 0);
glTexCoord2f (1.0, 1.0);glVertex3f (_pics[i].quad.botright.x(), _pics[i].quad.botright.y(), 0);
glTexCoord2f (0.0, 1.0);glVertex3f (_pics[i].quad.botleft.x(), _pics[i].quad.botleft.y(), 0);
glEnd();
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
После некоторого бенчмаркинга кажется, что интенсивное использование CPU происходит из блока "// draw texture". На самом деле, иногда это занимает 0 мс, а иногда 400 мс. В целом, функция paintGL отрисовывает сцену за 5 секунд, когда окно развернуто, и близко к 0, когда окно имеет размер 800 * 600.
Я изменяю масштаб во время рендеринга (изменяя только _globalScale), чтобы я мог видеть 150 изображений независимо от размера окна. Масштаб изображений ничего не меняет в зависимости от загрузки процессора.
Я начал использовать OpenGL 2 недели назад, поэтому наверняка что-то пропустил в документации и руководствах ... но даже если я прочитаю их снова, я не найду ни объяснения, ни другого способа визуализации этих 150 изображений.
В будущем будет возможно изменить изображение (точнее слой этой картинки, что подразумевает больше текстур) с помощью графического планшета или даже мыши, поэтому мне нужно улучшение скорости.