Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt 4.5.1] QGLWidget больше одного в приложении, тормозит 
:(
    Опции темы
babutta
Дата 5.8.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 18.12.2006

Репутация: нет
Всего: нет



Всем привет.

Использую:
Проц интел два ядра 2.33 ГГц, ОЗУ 2 гига, видеокарта GeForce 8400 GS (дрова свежие), WindowsXP SP3, Qt 4.5.1, MS 2005.

Вывожу просто растр, который постоянно меняется (типа очередь - добавлятся новая строка, все изображение сдвигается, старая строка уходит из поля видимости), период отрисовки 20мс. Никакого 3D, только 2D.
вобще с OpenGL работаю только неделю =)

Ситуация такая, когда я создаю один объект наследник QGLWidget, который отрисовывает один мой динамический растр размером 1024х768, время отрисовки несколько милисекунд, проц съедается на 1-3%%.
Когда одновременно запускаю 4 приложения ситауция аналогичная - проц почти не занимается - 1-4%%.
Когда я в одном приложении создаю больше одного объекта для отрисовки растра, то потребляемые ресурсы резко возрастают.
Например, я создаю 4 таких объекта, каждый из которых отображает растр размером 400х400, и проц сразу съедается по-моему более 50%, время отрисовки тоже очень сильно выростает....

Код

void GraphicWidget::initializeGL()
{
    glClearColor( 0.0, 0.0, 0.0, 0.0 );
    glShadeModel( GL_FLAT );
    glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
}


Код

void GraphicWidget::resizeGL( int width, int height )
{
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluOrtho2D( 0.0, ( GLfloat )width, 0.0, ( GLfloat )height );
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
    glViewport( 0, 0, ( GLint )width, ( GLint )height );
}


Код

void GraphicWidget::paintGL()
{
    glEnable( GL_BLEND );
    glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

    glClear( GL_COLOR_BUFFER_BIT );

    // вариант, когда один объект отображает один растр.
    glRasterPos2i( 0, 0 );
    glDrawPixels( LAYER_WIDTH, LAYER_HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, m_pRasterBuffer->image() );


    // вариант, когда один объект отображает 4 растра.
    //glRasterPos2i( 10, 10 );
    //glDrawPixels( LAYER_WIDTH, LAYER_HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, m_pRasterBuffer1->image() );

    //glRasterPos2i( LAYER_WIDTH + 20, 10 );
    //glDrawPixels( LAYER_WIDTH, LAYER_HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, m_pRasterBuffer2->image() );
    
    //glRasterPos2i( 10, LAYER_HEIGHT + 20 );
    //glDrawPixels( LAYER_WIDTH, LAYER_HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, m_pRasterBuffer3->image() );
    
    //glRasterPos2i( LAYER_WIDTH + 20, LAYER_HEIGHT + 20 );
    //glDrawPixels( LAYER_WIDTH, LAYER_HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, m_pRasterBuffer4->image() );

    glFlush();
}



Интересно, что отрисовка техже динамически изменяющихся четырех растров в одном объекте наследнике QGLWidget в разных позициях, занимает проца  до 4-х %%!
т.е. так же ничего не жрет как и отображение одного растра.

скриншот: 
user posted image

P.S. Использую OpenGL так как QPainter на пару с QPixmap в данном случае очень медленно работали.

Вопрос: Почему если в одном приложении одновременно отображается больше одного QGLWidget'a, то потребляемые ресурсы не пропорционально возрастают?

Это сообщение отредактировал(а) babutta - 5.8.2009, 11:49
PM MAIL   Вверх
bsa
Дата 5.8.2009, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



А пробовал использовать QPainter от QGLWidget?
PM   Вверх
babutta
Дата 5.8.2009, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 18.12.2006

Репутация: нет
Всего: нет



Цитата(bsa @ 5.8.2009,  16:35)
А пробовал использовать QPainter от QGLWidget?

не понял... как это "от"?

я пробовал на простом QWidget переопределять paintEvent - по скорости не прошел.
и переопределять paintEvent в QGLWidget рисуя с помощью QPainter я тоже пробовал, получается чуть хуже по скорости отрисовки, чуть больше проца съедается и плюс к этому еще загружаю видеопамять. В случае с QWidget в видеопамять ничего не отправлялось, смотрел утилитой.

Это сообщение отредактировал(а) babutta - 5.8.2009, 16:46
PM MAIL   Вверх
just_geek
Дата 6.8.2009, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 309
Регистрация: 13.12.2007

Репутация: 7
Всего: 10



Капец. glDrawPixels - ОЧЕНЬ медленная функция. Нужно от нее избавлятся. Так как происходит передача из RAM в GPU. И так каждый кадр. Не удивительно что все тормозит.

Это сообщение отредактировал(а) just_geek - 6.8.2009, 11:12
PM MAIL   Вверх
babutta
Дата 6.8.2009, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 18.12.2006

Репутация: нет
Всего: нет



Цитата(just_geek @ 6.8.2009,  11:09)
Капец. glDrawPixels - ОЧЕНЬ медленная функция. Нужно от нее избавлятся. Так как происходит передача из RAM в GPU. И так каждый кадр. Не удивительно что все тормозит.

дело в том, что ее скорость меня в общем-то устраивает, когда отрисовка происходит в единственном QGLWidget'e в приложении...
но вот когда появляются еще GL-виджеты, то тут и начинаются настоящие тормоза...

а вообще было бы очень интересно узнать по поводу альтернативы glDrawPixels и как я понял это использование текстур?

p.s. неделю и один день знаком с OpenGL =)
подскажи плз куда копать или ссылки дай, будь добр =)
PM MAIL   Вверх
just_geek
Дата 6.8.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 309
Регистрация: 13.12.2007

Репутация: 7
Всего: 10



Ну для начала вынеси:
Код

    glEnable( GL_BLEND );
    glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );


в initializeGL не зачем менять лишний раз стейты smile Хотя это ерунда. Так же убери glFlush. Qt сам позаботится о том что надо делать.

А вообще для каких то конкретных советов хотелось бы увидеть описание задачи, а то со скриншоты не совсем понятно что надо
PM MAIL   Вверх
babutta
Дата 6.8.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 18.12.2006

Репутация: нет
Всего: нет



Задача следующая:
Например есть 2 видеопотока. 
Отличие следующего кадра от предыдущего заключается в периодическом добавлении строк.
С кадрами потоков надо производить математические операции (напрмер, отрисовать второй поток поверх первого с определенной степенью прозрачности) и выводить результирующий поток на экран.
частота обновления кадров 50Гц, размер кадра 1024х768...

интересуют подходы к решению такого рода задач.

на примере предыдущего скриншота: линии каждого цвета (синие, красные, зеленые) подаются в отдельных видеопотоках.

Это сообщение отредактировал(а) babutta - 6.8.2009, 15:17
PM MAIL   Вверх
just_geek
Дата 6.8.2009, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 309
Регистрация: 13.12.2007

Репутация: 7
Всего: 10



Такую задачу не решал smile

Может это будет полезно?

Проигрывание AVI файла в OpenGL

Основной интерес представляют след. абазцы:
Цитата

Первоначально я создавал текстуру для каждого кадра анимации. Я получил несколько писем предлагающих мне использовать glTexSubImage2D(). После чтения «Красной книги по OpenGL», я наткнулся на следующую  цитату: «Создание текстуры может быть в вычислительном отношении более дорогостоящим, чем изменить существующую. В OpenGL версии 1.1 есть подпрограммы для замены всей площади или части текстуры на новую информацию. Это может быть полезно для некоторых приложений, которые делаю анимацию в реальном времени, и захвата видео изображений в текстуры. Для этих приложений имеет смысл создавать одну текстуру и использовать glTexSubImage2D() чтобы потом неоднократно заменять данные текстуры новыми видео изображениями».

  

Лично я не замечал огромного увеличения скорости, но если у вас слабая видеокарта вы могли бы стать свидетелем этого. Параметры для glTexSubImage2D() следующие: наша цель - двухмерная текстура (GL_TEXTURE_2D). Уровень детализации (0), который используется для мипмэпинга. Смещения x(0) и y(0) которые показывают функции, где начать копирование (0,0 нижний левый угол текстуры). У нас есть размеры изображения, которое мы хотим копировать (256*256). GL_RGB - это формат данных. Мы копируем беззнаковые данные. Очень просто.

PM MAIL   Вверх
babutta
Дата 6.8.2009, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 18.12.2006

Репутация: нет
Всего: нет



just_geek, благодарю за помощь, почитаю =)

Это сообщение отредактировал(а) babutta - 7.8.2009, 12:45
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0479 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.