![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
mezmay |
![]()
Сообщение
#1
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 272 Регистрация: 13.7.2009 Из: Ростов-на-Дону Пользователь №: 904 Спасибо сказали: 16 раз(а) Репутация: ![]() ![]() ![]() |
Захотел сделать удобное средство для вывода цифровых сигналов на график. Все бы ничего, только когда приходится отображать на виджете хотя бы 50.000 точек начинаются тормоза. Проверка на попадание точки в данный момент на график производится. Не понятно - как HD видео например на экран выводится? там же больше миллиона точек... или программа cool edit pro как отображает 10 млн точек без малейших тормозов? понятно, что она производит проверку на слияние и выводит только одну из всех слившихся, но все равно на экране вполне может оказаться больше 50.000 точек. Как вообще в таких случаях поступают?
вот мой пример. Здесь цикл по выводу точек на виджет с проверкой на попадание:
|
|
|
trdm |
![]()
Сообщение
#2
|
Дмитрий Трошин ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 575 Регистрация: 12.1.2008 Пользователь №: 68 Спасибо сказали: 21 раз(а) Репутация: ![]() ![]() ![]() |
Возможно лучшим вариантом будет не "painter.drawPoint"
что-то вроде пиксмап.сетПиксель(...) а потом painter.драуПиксмап Как считаешь, возможен такой выход? |
|
|
mezmay |
![]()
Сообщение
#3
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 272 Регистрация: 13.7.2009 Из: Ростов-на-Дону Пользователь №: 904 Спасибо сказали: 16 раз(а) Репутация: ![]() ![]() ![]() |
Возможно лучшим вариантом будет не "painter.drawPoint" что-то вроде пиксмап.сетПиксель(...) а потом painter.драуПиксмап Как считаешь, возможен такой выход? нет, так не быстрее. Но зато именно такой способ используют для того чтобы запоминать определенные положения графика и не перерисовывать его поточечно. а по поводу кул эдита - там все по-хитрому сделано и 50.000 точек никогда не отображается. Если надо отобразить 10 миллионов точек, то вместо них рисуют 1024 "палки" (если разрешение экрана например 1024х768). Где в каждую "палку" входит очень много точек - набор из (10 млн/1024)точек. Нижняя и верхняя границы "палки" - это минимум и максимум из этого набора. Ну и эти самые минимум и максимум уже соединяются, например, QLine'oм. При масштабировании по оси х все это дело растягивается и количество точек в каждом наборе уменьшается. После определенного момента уже появляются сами точки. В реальном времени 10 млн точек преобразовать в набор отезков нельзя, это происходит при открытии файла и занимает несколько секунд. Но и это еще не все. Допустим, мы открыли файл с этими пресловытыми десятью миллионами точек (а на самом деле там каким-то чудом и гораздо больше спокойно отображается). Выделили где нибудь в середине, например, 3.567.123 точки и нажали "увеличить". Указанный диапазон мгновенно масштабируется. Как это происходит - я пока не понял) Хотелось бы услышать идеи. |
|
|
mezmay |
![]()
Сообщение
#4
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 272 Регистрация: 13.7.2009 Из: Ростов-на-Дону Пользователь №: 904 Спасибо сказали: 16 раз(а) Репутация: ![]() ![]() ![]() |
Вот пример отображения большого массива в виде палок:
![]() а вот отмасштабированный кусок: ![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#5
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Указанный диапазон мгновенно масштабируется. картинка используется. Рисование осуществляется на картинке она масштабируется. А в фоне можно пытаться рисовать новую картинку, потом её отображать.Я эксперементировал с примером painting\svgviewer, загружал 120 МБ SVG'шку, загружается не быстро, но масштабируется моментально. |
|
|
pirks |
![]()
Сообщение
#6
|
Студент ![]() Группа: Участник Сообщений: 21 Регистрация: 5.7.2009 Пользователь №: 876 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Захотел сделать удобное средство для вывода цифровых сигналов на график. Все бы ничего, только когда приходится отображать на виджете хотя бы 50.000 точек начинаются тормоза. Проверка на попадание точки в данный момент на график производится. Не понятно - как HD видео например на экран выводится? там же больше миллиона точек... или программа cool edit pro как отображает 10 млн точек без малейших тормозов? понятно, что она производит проверку на слияние и выводит только одну из всех слившихся, но все равно на экране вполне может оказаться больше 50.000 точек. Как вообще в таких случаях поступают? вот мой пример. Здесь цикл по выводу точек на виджет с проверкой на попадание:
Может стоит выводить графики через QWT ? |
|
|
Cergey |
![]()
Сообщение
#7
|
Студент ![]() Группа: Участник Сообщений: 62 Регистрация: 18.10.2008 Пользователь №: 395 Спасибо сказали: 3 раз(а) Репутация: ![]() ![]() ![]() |
Вообще для работы с каждым пикселем используется класс QImage. Быстрее его уже нельзя!!!
|
|
|
ufna |
![]()
Сообщение
#8
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 362 Регистрация: 24.5.2008 Из: Курган/СПб Пользователь №: 182 Спасибо сказали: 29 раз(а) Репутация: ![]() ![]() ![]() |
Вообще, дело ведь в том, что рисовать нужно только то, что пользователь увидит. Т.е. отсчет ненужное изначально. А затем- правильно продумать КАК мы будем это рисовать. Кэширование, дв. буфф и т.п.
Имхо, сабж нужно повернуть в это русло, а не как убыстрить вывод 50к точек. |
|
|
pirks |
![]()
Сообщение
#9
|
Студент ![]() Группа: Участник Сообщений: 21 Регистрация: 5.7.2009 Пользователь №: 876 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Вообще, дело ведь в том, что рисовать нужно только то, что пользователь увидит. Т.е. отсчет ненужное изначально. А затем- правильно продумать КАК мы будем это рисовать. Кэширование, дв. буфф и т.п. Имхо, сабж нужно повернуть в это русло, а не как убыстрить вывод 50к точек. Да что вертеть, если есть уже написанные и отлаженные модули по выводу графиков и диограм )) |
|
|
mezmay |
![]()
Сообщение
#10
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 272 Регистрация: 13.7.2009 Из: Ростов-на-Дону Пользователь №: 904 Спасибо сказали: 16 раз(а) Репутация: ![]() ![]() ![]() |
Вообще, дело ведь в том, что рисовать нужно только то, что пользователь увидит. Т.е. отсчет ненужное изначально. А затем- правильно продумать КАК мы будем это рисовать. Кэширование, дв. буфф и т.п. Имхо, сабж нужно повернуть в это русло, а не как убыстрить вывод 50к точек. ну, я в это русло и повернут) в вроде бы все принципиальные вопросы продумал... 50к уже не вывожу)) такой вопрос - если я использую в качестве контекста рисования картинку (на которой делаю drawLine, drawPoint, drawRect а потом ее рисую )- то какую картинку быстрее использовать? QImage или QPixmap ? |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 20.6.2025, 23:22 |