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();
}


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


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

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


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Цитата(cerjo @ 7.5.2015, 8:56) *
Так а как QTimer связан с тем, что функция QPainter::end() выполняется долго? Мне кажется, даже если таймер врёт, тормоза отрисовки всё равно есть. Или я не правильно что-то понял?
Я ошибся при написании имелось ввиду QTime.
Может дело не в том, что долго выполняется, а округляется не в ту сторону, для примера вот код:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>

#include <QTime>

#define BILLION  1000000000L;

void getTime(char * arg)
{
    QTime time;
    time.start();

    struct timespec start, stop;

    if( clock_gettime( CLOCK_REALTIME, &start) == -1 )
    {
        perror( "clock gettime" );
        return;
    }
    double dstart = time.elapsed();

    system( arg );

    double dstop = time.elapsed();
    if( clock_gettime( CLOCK_REALTIME, &stop) == -1 )
    {
        perror( "clock gettime" );
        return;
    }
    double accum = ( stop.tv_sec - start.tv_sec ) + (double)( stop.tv_nsec - start.tv_nsec ) / (double)BILLION;

    printf( "%lf\n", dstop - dstart );
    printf( "%lf\n", accum );
}

int main( int argc, char** argv )
{
    for( int n=0; n < 10; ++n)
        getTime(argv[1]);
    return EXIT_SUCCESS;
}
при его выполнении наглядно видно, что Qt'шный вариант явно отстает:
"Вывод"
vigour@unknown-comp ~/workspace/test $ ./test ls
Makefile  test    test.cpp  test.o  test.pro  test.pro.user
6.000000
0.004901
Makefile  test    test.cpp  test.o  test.pro  test.pro.user
5.000000
0.004553
Makefile  test    test.cpp  test.o  test.pro  test.pro.user
4.000000
0.003928
Makefile  test    test.cpp  test.o  test.pro  test.pro.user
5.000000
0.003806
Makefile  test    test.cpp  test.o  test.pro  test.pro.user
4.000000
0.003810
Makefile  test    test.cpp  test.o  test.pro  test.pro.user
5.000000
0.004687
Makefile  test    test.cpp  test.o  test.pro  test.pro.user
4.000000
0.003613
Makefile  test    test.cpp  test.o  test.pro  test.pro.user
3.000000
0.002886
Makefile  test    test.cpp  test.o  test.pro  test.pro.user
4.000000
0.002676
Makefile  test    test.cpp  test.o  test.pro  test.pro.user
3.000000
0.002485
vigour@unknown-comp ~/workspace/test $
у меня Linux Mint 64x
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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




RSS Текстовая версия Сейчас: 29.11.2024, 12:53