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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: ускорить отрисовку текстур  (Прочитано 4624 раз)
axker
Гость
« : Апрель 10, 2012, 10:09 »

Изображение с нескольких камер накладывается на некоторые фигуры в пространстве (части цилиндра), задаваемые массивами индексов, вершин и текстурных координат

Код
C++ (Qt)
void Widget::paintGL()
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
   glCullFace(GL_BACK);
   glEnable(GL_CULL_FACE);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
 
   glPushMatrix();
       gluPerspective (30, 1, 1, 100);
       glTranslatef(0.0f, -0.75f, 0.0f);
       glRotatef(xRot1, 1.0f, 0.0f, 0.0f);
       glRotatef(yRot1, 0.0f, 1.0f, 0.0f);
       glRotatef(zRot1, 0.0f, 0.0f, 1.0f);
 
       glDeleteTextures(1, &textureID);
       textureID = bindTexture(QImage(camera1.getBuffer(), W, H, QImage::Format_ARGB32), GL_TEXTURE_2D);
       drawFigure();
 
       glDeleteTextures(1, &textureID2);
       textureID2 = bindTexture(QImage(camera2.getBuffer(), W, H, QImage::Format_ARGB32), GL_TEXTURE_2D);
       drawFigure2();
 
       glDeleteTextures(1, &textureID3);
       textureID3 = bindTexture(QImage(camera3.getBuffer(), W, H, QImage::Format_ARGB32), GL_TEXTURE_2D);
       drawFigure3();
   glPopMatrix();
 
   fps++;
   update();
}
 
void Widget::drawFigure()
{
  glVertexPointer(3, GL_FLOAT, 0, vecVertices.begin());
  glTexCoordPointer(2, GL_FLOAT, 0, vecTextures.begin());
  glDrawElements(GL_QUAD_STRIP, vecIndices.size(), GL_UNSIGNED_INT, vecIndices.begin());
}

Отрисовка трех кадров формата 1280х720 происходит со скоростью 20-25 кадров в секунду. Каким образом можно поднять производительность, доведя fps до 50 (камеры в отдельном потоке граббят с бОльшей частотой) ? Основная потеря времени происходит на bindTexture, можно ли как-то вынести обновление текстур в отдельный поток или оптимизировать сей процесс? Читал, что можно использовать wglShareLists, но мне нужно под Убунту. Заранее спасибо.
Записан
alexis031182
Гость
« Ответ #1 : Апрель 10, 2012, 10:56 »

Может быть напрямую гнать данные текстуры в GL с использованием glTexImage2D(), двойной буферизацией и минуя QImage? Нет, не подходит в Вашем случае?
Записан
axker
Гость
« Ответ #2 : Апрель 10, 2012, 12:51 »

это вот так?

Код
C++ (Qt)
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, 3, WD, HD, 0, GL_RGBA, GL_UNSIGNED_BYTE, camera1.getBuffer());

выигрыша нет почти никакого
Записан
V1KT0P
Гость
« Ответ #3 : Апрель 10, 2012, 12:56 »

Отрисовка трех кадров формата 1280х720 происходит со скоростью 20-25 кадров в секунду. Каким образом можно поднять производительность, доведя fps до 50 (камеры в отдельном потоке граббят с бОльшей частотой) ? Основная потеря времени происходит на bindTexture, можно ли как-то вынести обновление текстур в отдельный поток или оптимизировать сей процесс? Читал, что можно использовать wglShareLists, но мне нужно под Убунту. Заранее спасибо.
Советую глянуть исходники VLC, там явно оптимальный способ используется.
Записан
alexis031182
Гость
« Ответ #4 : Апрель 10, 2012, 13:04 »

это вот так?
...
выигрыша нет почти никакого
Да, так. Жаль. А переключать буферы пробовали (glXSwapBuffers) ? По идее, пока один заполняется, второй выводится. Должно помочь.
Записан
alexis031182
Гость
« Ответ #5 : Апрель 10, 2012, 13:05 »

Советую глянуть исходники VLC, там явно оптимальный способ используется.
А в VLC разве не XVideo используется? Или и GL тоже?
Записан
V1KT0P
Гость
« Ответ #6 : Апрель 10, 2012, 13:19 »

Советую глянуть исходники VLC, там явно оптимальный способ используется.
А в VLC разве не XVideo используется? Или и GL тоже?
Там разные способы вывода(OpenGL, DirectX, Windows GDI, прямо в видеопамять и т.д.). Но гуй у него на Qt написан, так что не проблема.
Записан
alexis031182
Гость
« Ответ #7 : Апрель 10, 2012, 13:58 »

Там разные способы вывода(OpenGL, DirectX, Windows GDI, прямо в видеопамять и т.д.). Но гуй у него на Qt написан, так что не проблема.
Глянул исходники ради интереса. На C написан. Гуя, видимо, как плагин или модуль реализована, а может вообще отдельно, т.к. в исходниках присутствует серверная часть.

По GL глянул. В общем-то, похоже, только glTexImage2D вызывается один раз сначала на некоторый пул кадров, а затем только glTexSubImage2D. Может быть здесь имеет смысл покопать.

И ещё... Автор темы писал, что изображения поступают с видеокамер, а формат рисуется, смотрю, RGBA. Производится конвертация? Просто OpenGL помимо RGB поддерживает и другие форматы, не столь объёмные. У некоторых из них даже и не заметить разницы по качеству с RGB. Это просто к слову, к вопросу о возможности ускорения и снижения нагрузки.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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