Russian Qt Forum
Ноябрь 25, 2024, 01:54
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
2D и 3D графика
>
Как рисовать не в paintEvent?
Страниц:
1
[
2
]
3
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Как рисовать не в paintEvent? (Прочитано 22753 раз)
lit-uriy
Джедай : наставник для всех
Offline
Сообщений: 3880
Re: Как рисовать не в paintEvent?
«
Ответ #15 :
Июль 16, 2009, 01:48 »
Цитировать
по их приходу надо подправить картинку, не перерисовывая целиком, потому что больно долго будет. Также данные куда-то складываются, и когда надо все перерисовать, то они тоже используются.
подобная ситуация возникает например при построении графика. Есть такая библиотека Qwt, можно наверняка глянуть её исходники.
Я не замечал существенных тормозов на динамически обновляемых графиках в их примерах.
Записан
Юра.
marty
Гость
Re: Как рисовать не в paintEvent?
«
Ответ #16 :
Июль 16, 2009, 01:55 »
Цитата: lit-uriy от Июль 16, 2009, 01:44
>>Вы бы лучше приведенный код попинали, вместо ёрничания.
ну я тебе ссылки давал, во втрой ссылке как раз расматривается вопрос рисования не в paintEvent
За ссылки спасибо, правда это не совсем то, что нужно. То, что нужно, пришлось самому написать
Записан
BRE
Гость
Re: Как рисовать не в paintEvent?
«
Ответ #17 :
Июль 16, 2009, 07:28 »
Цитата: marty от Июль 16, 2009, 01:32
По-моему, данное ограничение по рисованию только во время paintEvent довольно большой недостаток, которого нет у WinAPI (и его оберток) и у wxWidgets.
Рисовать на большинстве PaintDevice можно в любой момент, а вот рисовать на виджете можно только в paintEvent. Кстати как и в WinAPI и у wxWidgets (если мне память не изменяет).
Цитата: marty от Июль 16, 2009, 01:35
Я бы с удовольствием, но надо на плюсах, да так, чтоб работало с WTL, wxWidgets да с Qt. С последним постоянно какой-то гемморой возникает, в отличии от первых двух библиотек.
В свете последних обсуждений, вырисовывается закон:
Чем меньше человек знаком с Qt, тем больше он находит в ней несуществующих проблем.
«
Последнее редактирование: Июль 16, 2009, 07:31 от BRE
»
Записан
marty
Гость
Re: Как рисовать не в paintEvent?
«
Ответ #18 :
Июль 16, 2009, 10:45 »
Цитата: BRE от Июль 16, 2009, 07:28
Цитата: marty от Июль 16, 2009, 01:32
По-моему, данное ограничение по рисованию только во время paintEvent довольно большой недостаток, которого нет у WinAPI (и его оберток) и у wxWidgets.
Рисовать на большинстве PaintDevice можно в любой момент, а вот рисовать на виджете можно только в paintEvent. Кстати как и в WinAPI и у wxWidgets (если мне память не изменяет).
С wxWidget по этому вопросу еще не разбирался, а в винде можно рисовать в любой момент. Есть только небольшое отличие - контекс HDC надо получать через BeginPaint (в обработчике WM_PAINT) или GetDC в остальных случаях.
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Как рисовать не в paintEvent?
«
Ответ #19 :
Июль 16, 2009, 10:54 »
контекст устройства это вообще ппц... перегрузка пейнт эвента гораздо проще и адекватнее выглядит
Записан
marty
Гость
Re: Как рисовать не в paintEvent?
«
Ответ #20 :
Июль 16, 2009, 13:14 »
Цитата: Авварон от Июль 16, 2009, 10:54
контекст устройства это вообще ппц... перегрузка пейнт эвента гораздо проще и адекватнее выглядит
А чего тут ппц? В paintEvent'е все равно используется контекст рисования, а как он называется, HDC, wxDC или QPainter, это по-моему не принципиально.
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Как рисовать не в paintEvent?
«
Ответ #21 :
Июль 16, 2009, 13:28 »
эти классы имеют _разный_ смысл. контекст устройства - непонятная примочка, нафиг откуда мне взявшаяся. qpainter - класс-рисовальщик. А всякие bitblt это вообще вынос мозга...
Записан
break
Гипер активный житель
Offline
Сообщений: 846
Re: Как рисовать не в paintEvent?
«
Ответ #22 :
Июль 16, 2009, 22:27 »
Прочитал тему с самого начала!
Не пойму одного почему автор не хочет рисовать в PaintEvent - даже если предположить что в Qt с этим проблемы - зачем не использовать то подо что в Qt все рисования и затачивались. Кроме того контекст QPainter - сильно от личается от других контекстов- он имеет кучу доп. возможностей - например трансформации(scale, rotate и др.).
Записан
fuCtor
Гость
Re: Как рисовать не в paintEvent?
«
Ответ #23 :
Июль 18, 2009, 21:24 »
Заходя на форум хотел создать почти такой же топик.
Автора топика очень даже понимаю. самого интересует вопрос как бы ускорить вывод порядка тысячи полигонов с переключением стилей и тд. По замерам на отрисовку окна 1024 на 768 на котором помещалось порядка пары тысяч полигонов уходило порядка секунды. Отрисовку выполнял в буфер а только потом вывод буфера на бэкграунд GraphicsView.
Скорость явна маленькая и неприемлимая. При том что под WinAPI удалось точно такой же код разогнать до 300мс. Вознивает вопрос. Что не так делаю и куда копать чтоб ускорить отрисовку. Буфер используется для частичной перерисовки при смещении., путем дорисовки необходимого.
Записан
ufna
Гость
Re: Как рисовать не в paintEvent?
«
Ответ #24 :
Июль 18, 2009, 21:28 »
вопрос - а стили и т.п., да и сами полигоны на поле у тебя динамичные или статичные?
Записан
fuCtor
Гость
Re: Как рисовать не в paintEvent?
«
Ответ #25 :
Июль 18, 2009, 21:37 »
статичны и хранятся в дереве (полигоны). Стили тоже статичны. Если загрузить ВСЕ полигоны в виде GraphicsItem то это cъедает не мало памяти. Если фрагментами, то нарушается порядок следования (z-order). Судя по профайлеру то 80% времени съедает вывод именно полигонов, а не смена стиля рисования.
Записан
ufna
Гость
Re: Как рисовать не в paintEvent?
«
Ответ #26 :
Июль 18, 2009, 21:48 »
а можно сам код отрисовки глянуть?
Записан
fuCtor
Гость
Re: Как рисовать не в paintEvent?
«
Ответ #27 :
Июль 18, 2009, 21:56 »
Сейчас нет под рукой кода. Там просто хитрая система накручина с различными абстракциями и тд ). Собственно сами данные это картография.
а сама отрисовки сводится к:
- вывод обычных полигонов + плюс накопление для отложенного вывода при определенных условиях
- обработка списка отложенных полигонов
- вывод их
Записан
ufna
Гость
Re: Как рисовать не в paintEvent?
«
Ответ #28 :
Июль 19, 2009, 08:57 »
Просто любой рендеринг - это оптимизация. В данном случае я бы вообще выводил не на GVC (по-моему излишне, если все и так в буфер только пишется). И тут нужно смотреть флаги с которыми ты рисуешь картинку, как ее рисуешь, что еще важнее, потому как оптимизация вывода - штука, на которой все игрушки работают черт знает сколько лет уже
если картография, то наверняка у тебя нет каждый раз изменения стилей, вывод - пока не сменили стиль, перерисовывать не нужно. Можно разбить на куски, которые только будем перерисовывать, если возможно. Порядок z-следования - нужно считать отдельно заранее (раз он должен
сохраниться
). И т.д., и т.п. Потому и хочу посмотреть, т.к. код сказал бы куда большее
Записан
fuCtor
Гость
Re: Как рисовать не в paintEvent?
«
Ответ #29 :
Июль 19, 2009, 12:36 »
Полученный буфер потом выводится на QGV и поверх него еще элементы интерфейса рисуются (QGI).
Оптимизировал алгоритм, стало все очень даже прилично ) Осталось с надписями разобраться, раза в 3 4 просаживают.
Для дополнительной оптимизации вобще думаю переписать paintEvent у QGV (взять его родной и убрать оттуда буфер фона, заменив его на свой).
А код в итоге не разрешили показывать
мол коммерческая тайна...
Записан
Страниц:
1
[
2
]
3
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...