Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Batching при выводе графики 
:(
    Опции темы
Glad
  Дата 3.5.2014, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет.

Подскажите есть ли в Qt такое понятие как batching, т.е. когда вывод одинаковых спрайтов/картинок можно сделать одним вызовом ? И вообще хотелось бы поднять тему оптимизации при выводе графики(особенно анимированной) в Qt. У меня просто выводится сетка из линий.. и чем большее кол-во линий тем больше тормозит отрисовка. Скажем на 300 линиях тормоза очень даже заметны.

Заранее спасибо.
PM MAIL   Вверх
Amp
Дата 4.5.2014, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В новом сценграфе для Qt Quick батчинг есть. Элементы там группируются по материалам, прозрачности, шейдерам, плюс битмапы собираются в текстурные атласы. А 300 линий ну никак не должны тормозить, только если это не выводятся через GDI+ какой-нибудь smile
PM MAIL   Вверх
Glad
Дата 5.5.2014, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Amp @  4.5.2014,  20:09 Найти цитируемый пост)
В новом сценграфе для Qt Quick батчинг есть. Элементы там группируются по материалам, прозрачности, шейдерам, плюс битмапы собираются в текстурные атласы. А 300 линий ну никак не должны тормозить, только если это не выводятся через GDI+ какой-нибудь smile 


Хм.. и мне тоже интересно.. Ну вот пример кода выводящего сетку под задником(background image):
Код

void MapScene::RebuildGrid()
{
    if (!m_bInitialized)
        return;

    removeItem(m_pGrid);
    delete m_pGrid;

    qreal fScale = m_pBackgoundItem->scale();
    qreal w = m_pBackgoundItem->boundingRect().right()*fScale;
    qreal h = m_pBackgoundItem->boundingRect().bottom()*fScale;
    m_pGrid = new QGraphicsItemGroup;
    for (int i = 0; i<w; i+=m_iCellGridSize)
    {
        QLine vline(i, 0, i, h);
        QGraphicsLineItem* pvGLI = new QGraphicsLineItem(vline);
        m_pGrid->addToGroup(pvGLI);

        for (int j = 0; j<h; j+=m_iCellGridSize)
        {
            QLine hline(0, j, w, j);
            QGraphicsLineItem* phGLI = new QGraphicsLineItem(hline);
            m_pGrid->addToGroup(phGLI);
        }
    }

    m_pGrid->setZValue(2.0);
    addItem(m_pGrid);
}


Хотел сделать сетку из 25000 линий  smile прога просто повисла.. Максимум удалось вроде 10000. Но прога дико тормозила.
Кстати еще один факт, если убрать линии с экрана то вроде как тормоза убираются (что логично), а вот если убрать задник(сделать невидимым, но всё ещё являющимся объектом сцены), то никакого эффекта.. А вот если его просто не загружать, то всё работает намного быстрее.

PM MAIL   Вверх
math64
Дата 5.5.2014, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Я рисую сетку так:
Код

double toGrid(double x, double w) {
       return ceil(x / w) * w;
}

void MyGraphicsView::drawBackground(QPainter *painter, const QRectF &rect)
{
      QGraphicsView::drawBackground(painter, rect);
      QSizeF myGrid = grid();
      if (!myGrid.isEmpty()) {
        QRectF r = scene()->sceneRect();
        r = r.intersected(rect);
        QPen pen(Qt::DashDotDotLine);
        pen.setColor(Qt::darkGray);
        painter->setPen(pen);
        for (double w = myGrid.width(), x = toGrid(r.left(), w); x < r.right(); x += w)
            painter->drawLine(QLineF(x, r.top(), x, r.bottom()));
        for (double h = myGrid.height(), y = toGrid(r.top(), h); y < r.bottom(); y += h)
            painter->drawLine(QLineF(r.left(), y, r.right(), y));
      }
}

PM   Вверх
Amp
Дата 5.5.2014, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Glad @  5.5.2014,  14:22 Найти цитируемый пост)
Хотел сделать сетку из 25000 линий  smile прога просто повисла.. Максимум удалось вроде 10000. Но прога дико тормозила.

Так столько примитивов пихать в QGraphicsView - это же жесть. Неудивительнно, что скорость отрисовки так фатально просела. Я бы тоже делал как math64 - рисовал в QPainter и, возможно, кэшировал потом в QPixmap, обновляя по необходимости. Еще можно попробовать сложить их все в QGraphicsItemGroup и включить кэширование, но не уверен.
PM MAIL   Вверх
math64
Дата 6.5.2014, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Цитата(Amp @  5.5.2014,  21:35 Найти цитируемый пост)
Еще можно попробовать сложить их все в QGraphicsItemGroup и включить кэширование, но не уверен. 

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

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

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


 




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


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

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