Russian Qt Forum
Ноябрь 25, 2024, 00:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: [SOLVED]Тормозит отрисовка окружностей большого радиуса  (Прочитано 14808 раз)
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #15 : Сентябрь 15, 2009, 10:12 »

Ага, а можно назвать специалированным и заточенным под рисование виджетов Улыбающийся.
Ну для растеризации под окошки размеры вроде вполне достаточные )
Но тогда не понятно почему при включении отсечения столько много времени начинает тратиться на самом этом отсечении. Ведь наверняка в Java2D не делают растеризацию всей окружности, когда ее радиус огромный, скорее всего только в видимом участке растеризация происходит. Кроме того странно еще то, что судя по второму скриншоту там пересечение кривых безье ищется, хотя по идее для отсечения окружности (эллипса) такого не должно происходить.

Попробуйте лучше Graphics View Framework.
А чем он здесь поможет? Тем более в нем не поддерживаются cosmetic pens with non zero width:
Цитировать
QGraphicsItem does not support use of cosmetic pens with a non-zero width.
А мне как раз хотелось бы рисовать линии с некоторой постоянной толщиной, не зависящей от уровня зума.
Записан
Tonal
Гость
« Ответ #16 : Сентябрь 15, 2009, 10:22 »

На Win9x GDI 16-ти разрядный. И вроде на старых Маках.
Так что это, возможно артефакт ещё тех времён.

Кроме того, я как-то на Win9x столкнулся с тем, что некоторые функции начинали чудить уже при привышении 4*1024 в значении любой координаты...
Записан
SABROG
Гость
« Ответ #17 : Сентябрь 15, 2009, 10:59 »

На Win9x GDI 16-ти разрядный. И вроде на старых Маках.
Так что это, возможно артефакт ещё тех времён.

Кроме того, я как-то на Win9x столкнулся с тем, что некоторые функции начинали чудить уже при привышении 4*1024 в значении любой координаты...

Проверил на WinXP, тормозит при scale factor выше ~5k. После этого если зумить дальше и пытаться перетаскивать, то программа просто может зависнуть на несколько секунд. При этом память не кушается.
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #18 : Сентябрь 15, 2009, 11:05 »

Проверил на WinXP, тормозит при scale factor выше ~5k. После этого если зумить дальше и пытаться перетаскивать, то программа просто может зависнуть на несколько секунд. При этом память не кушается.
Размеры bounding rect для всей конструкции как раз где-то 13x13, т.е. радиуса ~6. При scale factor больше ~5k как раз будет вылезать за указанный выше предел. После этого включается clip и начинаются жуткие тормоза. Как обойти эту проблему не понятно.
Записан
SABROG
Гость
« Ответ #19 : Сентябрь 15, 2009, 12:27 »

Я немного модифицировал программу таким образом, чтобы сразу видно было в чем проблема. Достаточно двигать правой кнопкой мышки по окну и все лагает. Я приаттачил компилируемый пример.
Записан
Winstrol
Гость
« Ответ #20 : Сентябрь 15, 2009, 12:47 »

Можно попытаться включить hardware ускорение, запустив приложение из коммандной строки -graphicssystem opengl
Записан
SABROG
Гость
« Ответ #21 : Сентябрь 15, 2009, 12:50 »

Можно попытаться включить hardware ускорение, запустив приложение из коммандной строки -graphicssystem opengl
У меня это приводит к тому, что виджет становится белым и ничего не рисуется. А в консоль пишется такое:

Код:
PB Sample buffers: false
hijackWindow() context created for Widget(0x22ff18, name = "Widget") 1
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #22 : Сентябрь 15, 2009, 13:46 »

Заметил еще одно различие по сравнению с Java версией. Если после старта распахнуть окно на весь экран (у меня это 1680х1050) и начать активно таскать мышкой с зажатой правой кнопкой,
то Qt загружает полностью одно ядро процессора:

а вот Java не больше 10-12%:

правда памяти Java как всегда отхапала со старта около 30Мб.

Это нормальное поведение для Qt при отрисовке на большом widget? Или это можно как-то исправить?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #23 : Сентябрь 15, 2009, 14:40 »

kamre, попробуй на Qt 4.6 TP1 попробовать
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #24 : Сентябрь 16, 2009, 17:41 »

kamre, попробуй на Qt 4.6 TP1 попробовать
Обязательно попробую, уже скачал исходники осталось собрать и попробовать. Только скорее всего это не поможет, т.к. судя по исходникам здесь и здесь в этой версии ничего особо не изменилось.

P.S. собралось под win32-msvc2008, никаких отличий нет, т.е. тормозит также.
« Последнее редактирование: Сентябрь 17, 2009, 00:20 от kamre » Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #25 : Сентябрь 17, 2009, 10:36 »

Похоже так просто сразу все рисовать через QPainter не получится в моем случае. Нужно будет самому делать clip под окошко. Например, вот так не тормозит уже ни при каком зуме:

Код
C++ (Qt)
void Widget::paintEvent(QPaintEvent *event)
{
   qreal penWidth = 1.5;
   QPainter painter(this);
   painter.fillRect(0, 0, width(), height(), Qt::darkGray);
   painter.setBrush(Qt::NoBrush);
   painter.setPen(QPen(QBrush(Qt::white), penWidth));
   painter.setRenderHint(QPainter::Antialiasing, true);
   QRectF clipRect(0, 0, width(), height());
   clipRect.adjust(-penWidth, -penWidth, penWidth, penWidth);
   QPainterPath clipPath;
   clipPath.addRect(clipRect);
   foreach(const circle &c, circles) {
       QPointF center = c.c * scale + shift;
       qreal radius = c.r * scale;
       QPainterPath path;
       path.addEllipse(center, radius, radius);
       path = path.intersected(clipPath);
       if (path != clipPath)
           painter.drawPath(path);
   }
}
 
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.077 секунд. Запросов: 23.