Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QPainter время отрисовки
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Система рисования. Печать
cerjo
Добрый день!

Столкнулся с такой проблемой: унаследовал класс (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
Как вариант нужно посмотреть, что использует QTimer в Windows и QNX, думается мне, что он не оптимально работает в QNX и нужно для QNX использовать нативное API.
Или реализация QGLWidget в QNX хуже, чем в Windows, что в полне может быть...
wiz29
А приоритет процесса какой на QNX? Много ли там других задач "крутится" в момент выполнения вашей программы и какие у них приоритеты на исполнение?
cerjo
Цитата(ViGOur @ 6.5.2015, 10:21) *
Как вариант нужно посмотреть, что использует QTimer в Windows и QNX, думается мне, что он не оптимально работает в QNX и нужно для QNX использовать нативное API.
Или реализация QGLWidget в QNX хуже, чем в Windows, что в полне может быть...


Так а как QTimer связан с тем, что функция QPainter::end() выполняется долго? Мне кажется, даже если таймер врёт, тормоза отрисовки всё равно есть. Или я не правильно что-то понял?

Цитата(wiz29 @ 6.5.2015, 18:56) *
А приоритет процесса какой на QNX? Много ли там других задач "крутится" в момент выполнения вашей программы и какие у них приоритеты на исполнение?


Приоритет процесса пока не могу посмотреть, через пару дней только, пока плата недоступна. В принципе из "весомого" крутится только screen.
Раскрывающийся текст
pid tid name prio STATE Blocked
1 1 /procnto-smp-instr 0f RUNNING
1 2 /procnto-smp-instr 0f RUNNING
1 3 /procnto-smp-instr 0f RUNNING
1 4 /procnto-smp-instr 0f READY
1 6 /procnto-smp-instr 255r RECEIVE 1
1 7 /procnto-smp-instr 255r RECEIVE 1
1 8 /procnto-smp-instr 255r RECEIVE 1
1 9 /procnto-smp-instr 10r RUNNING
1 10 /procnto-smp-instr 10r RECEIVE 1
1 11 /procnto-smp-instr 10r RECEIVE 1
1 12 /procnto-smp-instr 24r RECEIVE 1
1 14 /procnto-smp-instr 10r RECEIVE 1
1 16 /procnto-smp-instr 10r RECEIVE 1
1 17 /procnto-smp-instr 10r RECEIVE 1
1 18 /procnto-smp-instr 24r RECEIVE 1
2 1 c/boot/devc-sermx1 24r RUNNING 1
2 2 c/boot/devc-sermx1 10r SIGWAITINFO
3 1 proc/boot/slogger 15r RECEIVE 1
4 1 proc/boot/pipe 10r SIGWAITINFO
4 2 proc/boot/pipe 10r RECEIVE 1
4 3 proc/boot/pipe 24r RECEIVE 1
4 4 proc/boot/pipe 10r RECEIVE 1
5 1 proc/boot/i2c-mx35 21r RECEIVE 1
6 1 proc/boot/i2c-mx35 10r RECEIVE 1
7 1 mcsd-mx6q-sabreARD 10r SIGWAITINFO
7 2 mcsd-mx6q-sabreARD 21r RECEIVE 1
7 3 mcsd-mx6q-sabreARD 21r RECEIVE 4
7 4 mcsd-mx6q-sabreARD 10r RECEIVE 10
7 5 mcsd-mx6q-sabreARD 10r RECEIVE 13
7 6 mcsd-mx6q-sabreARD 10r RECEIVE 7
7 7 mcsd-mx6q-sabreARD 21r RECEIVE 7
7 8 mcsd-mx6q-sabreARD 21r RECEIVE 7
8 1 mcsd-mx6q-sabreARD 10r SIGWAITINFO
8 2 mcsd-mx6q-sabreARD 21r RECEIVE 1
8 3 mcsd-mx6q-sabreARD 21r RECEIVE 4
8201 1 proc/boot/io-audio 21r SIGWAITINFO
8201 2 proc/boot/io-audio 50r RECEIVE 4
8201 3 proc/boot/io-audio 50r RECEIVE 7
8201 4 proc/boot/io-audio 21r RECEIVE 13
8201 5 proc/boot/io-audio 50r RECEIVE 16
8201 6 proc/boot/io-audio 25r CONDVAR (0x808d46c)
8201 8 proc/boot/io-audio 10r RECEIVE 1
8201 9 proc/boot/io-audio 21r RECEIVE 1
8201 10 proc/boot/io-audio 10r RECEIVE 1
8202 1 proc/boot/io-usb 10r SIGWAITINFO
8202 2 proc/boot/io-usb 10r RECEIVE 4
8202 3 proc/boot/io-usb 21r RECEIVE 7
8202 4 proc/boot/io-usb 21r RECEIVE 10
8202 5 proc/boot/io-usb 21r RECEIVE 1
8202 6 proc/boot/io-usb 21r RECEIVE 13
8202 7 proc/boot/io-usb 21r RECEIVE 13
8202 8 proc/boot/io-usb 21r RECEIVE 13
8203 1 oc/boot/devb-umass 10r SIGWAITINFO
8203 2 oc/boot/devb-umass 21r REPLY 8202
8203 3 oc/boot/devb-umass 21r RECEIVE 4
8203 4 oc/boot/devb-umass 21r RECEIVE 1
8203 5 oc/boot/devb-umass 21r RECEIVE 7
8203 6 oc/boot/devb-umass 21r RECEIVE 10
8203 7 oc/boot/devb-umass 21r RECEIVE 4
8203 8 oc/boot/devb-umass 21r RECEIVE 4
8203 9 oc/boot/devb-umass 21r RECEIVE 4
8204 1 roc/boot/io-pkt-v4 21r SIGWAITINFO
8204 2 roc/boot/io-pkt-v4 21r RECEIVE 1
8204 3 roc/boot/io-pkt-v4 21r RECEIVE 22
8205 1 c/boot/dhcp.client 10r SIGWAITINFO
8206 1 /boot/devf-generic 10r SIGWAITINFO
8206 2 /boot/devf-generic 10r RECEIVE 1
8206 3 /boot/devf-generic 10r RECEIVE 1
8206 4 /boot/devf-generic 10r RECEIVE 1
8206 5 /boot/devf-generic 10r RECEIVE 1
8207 1 proc/boot/qconn 10r SIGWAITINFO
8207 2 proc/boot/qconn 10r CONDVAR (0x805f520)
8207 3 proc/boot/qconn 10r RECEIVE 2
8207 4 proc/boot/qconn 10r RECEIVE 1
8208 1 proc/boot/devc-pty 10r RECEIVE 1
8211 1 proc/boot/inetd 10r SIGWAITINFO
12306 1 proc/boot/devf-ram 10r SIGWAITINFO
12306 2 proc/boot/devf-ram 10r RECEIVE 1
12306 3 proc/boot/devf-ram 10r RECEIVE 1
12306 4 proc/boot/devf-ram 10r RECEIVE 1
12306 5 proc/boot/devf-ram 10r RECEIVE 1
28689 1 bin/sh 10r SIGSUSPEND
28692 1 proc/boot/ksh 10r SIGSUSPEND
77845 1 sbin/screen 10r SIGWAITINFO
77845 2 sbin/screen 10r SEM 6faf8054
77845 3 sbin/screen 10r SEM 6faf8174
77845 4 sbin/screen 10r SEM 6faf81ec
77845 5 sbin/screen 10r SEM 6faf82ac
77845 6 sbin/screen 10r SEM 6faf83cc
77845 7 sbin/screen 10r SEM 6faf8414
77845 8 sbin/screen 10r SEM 6faf845c
77845 9 sbin/screen 10r SEM 6faf84a4
77845 10 sbin/screen 21r RECEIVE 1
77845 11 sbin/screen 21r RECEIVE 4
77845 12 sbin/screen 10r RECEIVE 7
77845 13 sbin/screen 21r RECEIVE 13
77845 14 sbin/screen 15r RECEIVE 10
77845 15 sbin/screen 15r CONDVAR (0x809695c)
77845 16 sbin/screen 10r RECEIVE 16
77845 17 sbin/screen 10r NANOSLEEP
77845 18 sbin/screen 10r RECEIVE 16
77845 19 sbin/screen 40r RECEIVE 21
77845 20 sbin/screen 10r RECEIVE 16
77845 21 sbin/screen 10r RECEIVE 16
77845 22 sbin/screen 10r RECEIVE 16
77845 23 sbin/screen 15r RECEIVE 16
77845 24 sbin/screen 15r CONDVAR (0x7805f218)
77845 25 sbin/screen 15r RECEIVE 24
ViGOur
Цитата(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
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.