Название: Тормоза при отрисовки своего QWidget'a Отправлено: irq от Март 03, 2008, 12:00 Пишу программу, работающую с сетью. Было необходимо написать QWidget, который рисует графики скорости входящего и исходящего графика, используя линии разного цвета и обновляется, разумеется ежесекундно. Казалось бы, все хорошо, но есть такое НО: очень сильно тормозит программа (да и процессор грузится сильно) во время отрисовки.
Надеюсь, что кто-нибудь подскажет как можно ускорить (оптимизировать). Есть идея вынести логическую часть в отдельный поток, но я не думаю, что это исправит дело, поскольку логика довольно простая... Ее суть: каждую секнду снимаются показания скорости с сокета и заносятся в QList<int64_t> dlist, uplist; соответственною Привожу функцию отрисовки: Код: void QMyStats::paintEvent(QPaintEvent *) speed6 - это максимально-достигнутая скорость. Также это максимальная скорость для шкалы speed{1..5} - вычисляются исходя из нее. Чтобы все не звучало слишком абстрактно прилагаю скриншот... Буду рад выслушать конструктивные замечания или дельные предложения. Для большей ясности... Код: bool QMyStats::eachSecond() Название: Re: Тормоза при отрисовки своего QWidget'a Отправлено: Tonal от Март 03, 2008, 19:33 Можа просто Qwt использовать, и не мучиться? :-)
Ну а по смыслу: не надо каждый раз весть график отрисовывать. Или используй scroll, или рисуй в дополнительный буфер. Название: Re: Тормоза при отрисовки своего QWidget'a Отправлено: Вячеслав от Март 03, 2008, 21:00 Цитировать for (int i = 0; i < dlist.count()-1; i++ ) { painter.drawLine(82 + (668*i)/dlist.count(), 551 - 498*dlist.at(i)/speed6 , 82 + (668*(i+1))/dlist.count() , 551 - 498*dlist.at(i+1)/speed6 ); } А это вообще интересно выглядит ..... в пайнте _каждый_ раз считать координаты :( Мя :( Дооолго .... Тогда-уж массив структур и считать при добавлении (все кроме деления на speed6)..... И не ленись компилятору чуть помочь он dist.count() каждый раз будет дергать - проще за циклом переменную сунуть(да и в условие цикла тож) А вообще накойХ контейнер сдался если Цитировать if ( dlist.count() >= 334) dlist.removeAt(0); проще IMHO простой тупой массив структур и memmove ;) Или размер планируеться динамический ?dlist.append(ddiff); Кстати народ а Tulip'е at и [] одинаковы по реализации ? или как ? Название: Re: Тормоза при отрисовки своего QWidget'a Отправлено: pastor от Март 03, 2008, 21:56 Цитировать at() can be faster than operator[](), because it never causes a deep copy to occur. На практике это высказывание подтверждаеться ;) Название: Re: Тормоза при отрисовки своего QWidget'a Отправлено: irq от Март 04, 2008, 10:01 Цитировать for (int i = 0; i < dlist.count()-1; i++ ) { painter.drawLine(82 + (668*i)/dlist.count(), 551 - 498*dlist.at(i)/speed6 , 82 + (668*(i+1))/dlist.count() , 551 - 498*dlist.at(i+1)/speed6 ); } А это вообще интересно выглядит ..... в пайнте _каждый_ раз считать координаты :( Мя :( Дооолго .... Тогда-уж массив структур и считать при добавлении (все кроме деления на speed6)..... И не ленись компилятору чуть помочь он dist.count() каждый раз будет дергать - проще за циклом переменную сунуть(да и в условие цикла тож) А вообще накойХ контейнер сдался если Цитировать if ( dlist.count() >= 334) dlist.removeAt(0); проще IMHO простой тупой массив структур и memmove ;) Или размер планируеться динамический ?dlist.append(ddiff); Кстати народ а Tulip'е at и [] одинаковы по реализации ? или как ? Да, согласен что вычислять координаты в paint'e - не самый лучый способ, но они изменяются постоянно, если текущее значение скорости превысило максимум (speed6). Наверняка это не самые большие тормоза. Сейчас копаю в сторону QGraphicsView. Если кто-то с ним работал, буду рад любой помощи, по возможности примерам реализации (qtdemo не в счет). Название: Re: Тормоза при отрисовки своего QWidget'a Отправлено: Вячеслав от Март 04, 2008, 12:26 Таки возми профайлера и посмотри где тормоза ;)
А для начала - чуть оптимизируй код - хотя-б count() за цикл выкини .... или рисуй на битмапе,а в пайнт только битмап пихай .... QGraphicsView - это немнго не из той серии - это IMHO задел для вещей типа визио \ диа .... Название: Re: Тормоза при отрисовки своего QWidget'a Отправлено: Tonal от Март 04, 2008, 13:02 Да, и в любом случае, если рисуешь ломаную лучше использовать drawPolyline для всей ломаной, чем отдельные drawLine для сегментов.
В drawPolyline используется некоторое количество оптимизаций - например не прорисовываются дважды концы отрезков. И всё таки я бы рекомендовал qwt. Если таки хочется разобраться и всё самому - делай scroll виджету и дорисовывай только то, что изменилось. Ну и координаты в буфере сдвигай а не рассчитывай всё наново. |