crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> QPainter время отрисовки
cerjo
  опции профиля:
сообщение 6.5.2015, 9:16
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 6.5.2015
Пользователь №: 4378

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый день!

Столкнулся с такой проблемой: унаследовал класс (TWidget) от QGLWidget, переопределил paintEvent, в нём QPainter-ом отрисовываю изображение. QTimer, связанный со слотом TWidget::update, "тИкает" каждые 16 мс (1000 мс / 60 Гц). На хостовой машине (Intel Core i5) отрисовка плавная и красивая. На целевой (Freescale i.MX6, CPU: Quad Core ARM Cortex A9, GPU: 3D - Vivante GC2000, 2D - Vivante GC320) машине FPS падает ~до 20-ти.
Завёл QTime в начале paintEvent, по окончании вывожу QTime::elapsed, показывает 32 мс. Даже при пустом paintEvent, функция QPainter::end() занимает 32 мс. Можно ли как-нибудь уменьшить это время?
Qt 5.4, хостовая ос Windows 7, целевая - QNX 6.6.
Целевая машина пишет, что QOpenGLWidget не прикручен, посему наследуюсь от QGLWidget.

P.S. Пробовал связку QGraphicsView + QGraphicsScene + QGraphicsItem-ы = 1-2 FPS. А при QGraphicsView::setViewPort(new QGLWidget()) - черный экран на целевой машине.

twidget.h
#ifndef TWIDGET_H
#define TWIDGET_H

#include <QGLWidget>
#include <QPaintEvent>

class TWidget : public QGLWidget
{
public:
    TWidget();
    ~TWidget();
protected:
    void paintEvent(QPaintEvent*);

};

#endif // TWIDGET_H


twidget.cpp
#include "twidget.h"
#include <QTime>
#include <QPainter>
#include <iostream>


TWidget::TWidget()
{
}

TWidget::~TWidget()
{
}

void TWidget::paintEvent(QPaintEvent *event)
{
    QTime time;
    time.start();
    QPainter painter(this);
//    static QPixmap pic(QPixmap(":/Background.png").scaled(this->width(), this->height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
//    painter.drawPixmap(this->geometry(), pic);
    std::cout << "Before painter.end() time is: " << time.elapsed() << std::endl << std::flush;
    painter.end();
    std::cout << "After painter.end() time is: " << time.elapsed() << std::endl << std::flush;
    event->accept();
}


Лог на хосте:
Прикрепленное изображение


Лог на целевой:
Прикрепленное изображение

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
wiz29
  опции профиля:
сообщение 6.5.2015, 18:56
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


А приоритет процесса какой на QNX? Много ли там других задач "крутится" в момент выполнения вашей программы и какие у них приоритеты на исполнение?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.11.2024, 21:31