crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
mezmay
  опции профиля:
сообщение 6.8.2009, 7:41
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Захотел сделать удобное средство для вывода цифровых сигналов на график. Все бы ничего, только когда приходится отображать на виджете хотя бы 50.000 точек начинаются тормоза. Проверка на попадание точки в данный момент на график производится. Не понятно - как HD видео например на экран выводится? там же больше миллиона точек... или программа cool edit pro как отображает 10 млн точек без малейших тормозов? понятно, что она производит проверку на слияние и выводит только одну из всех слившихся, но все равно на экране вполне может оказаться больше 50.000 точек. Как вообще в таких случаях поступают?

вот мой пример. Здесь цикл по выводу точек на виджет с проверкой на попадание:

for(int i=0; i<data.size(); i++){            
            if(tx> left && tx < right && ty > bottom && ty < top)            
                painter.drawPoint(QPoint(tx + dx, -ty + dy));                
    }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
trdm
  опции профиля:
сообщение 6.8.2009, 11:52
Сообщение #2


Дмитрий Трошин
****

Группа: Участник
Сообщений: 575
Регистрация: 12.1.2008
Пользователь №: 68

Спасибо сказали: 21 раз(а)




Репутация:   6  


Возможно лучшим вариантом будет не "painter.drawPoint"
что-то вроде
пиксмап.сетПиксель(...)
а потом
painter.драуПиксмап
Как считаешь, возможен такой выход?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 7.8.2009, 19:44
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Цитата(trdm @ 6.8.2009, 12:52) *
Возможно лучшим вариантом будет не "painter.drawPoint"
что-то вроде
пиксмап.сетПиксель(...)
а потом
painter.драуПиксмап
Как считаешь, возможен такой выход?


нет, так не быстрее. Но зато именно такой способ используют для того чтобы запоминать определенные положения графика и не перерисовывать его поточечно.

а по поводу кул эдита - там все по-хитрому сделано и 50.000 точек никогда не отображается. Если надо отобразить 10 миллионов точек, то вместо них рисуют 1024 "палки" (если разрешение экрана например 1024х768). Где в каждую "палку" входит очень много точек - набор из (10 млн/1024)точек. Нижняя и верхняя границы "палки" - это минимум и максимум из этого набора. Ну и эти самые минимум и максимум уже соединяются, например, QLine'oм. При масштабировании по оси х все это дело растягивается и количество точек в каждом наборе уменьшается. После определенного момента уже появляются сами точки.

В реальном времени 10 млн точек преобразовать в набор отезков нельзя, это происходит при открытии файла и занимает несколько секунд.

Но и это еще не все. Допустим, мы открыли файл с этими пресловытыми десятью миллионами точек (а на самом деле там каким-то чудом и гораздо больше спокойно отображается). Выделили где нибудь в середине, например, 3.567.123 точки и нажали "увеличить". Указанный диапазон мгновенно масштабируется. Как это происходит - я пока не понял) Хотелось бы услышать идеи.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 7.8.2009, 20:53
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Вот пример отображения большого массива в виде палок:


а вот отмасштабированный кусок:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 7.8.2009, 22:40
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(mezmay @ 7.8.2009, 23:44) *
Указанный диапазон мгновенно масштабируется.
картинка используется. Рисование осуществляется на картинке она масштабируется. А в фоне можно пытаться рисовать новую картинку, потом её отображать.

Я эксперементировал с примером painting\svgviewer, загружал 120 МБ SVG'шку, загружается не быстро, но масштабируется моментально.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
pirks
  опции профиля:
сообщение 8.8.2009, 14:35
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 5.7.2009
Пользователь №: 876

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(mezmay @ 6.8.2009, 8:41) *
Захотел сделать удобное средство для вывода цифровых сигналов на график. Все бы ничего, только когда приходится отображать на виджете хотя бы 50.000 точек начинаются тормоза. Проверка на попадание точки в данный момент на график производится. Не понятно - как HD видео например на экран выводится? там же больше миллиона точек... или программа cool edit pro как отображает 10 млн точек без малейших тормозов? понятно, что она производит проверку на слияние и выводит только одну из всех слившихся, но все равно на экране вполне может оказаться больше 50.000 точек. Как вообще в таких случаях поступают?

вот мой пример. Здесь цикл по выводу точек на виджет с проверкой на попадание:

for(int i=0; i<data.size(); i++){            
            if(tx> left && tx < right && ty > bottom && ty < top)            
                painter.drawPoint(QPoint(tx + dx, -ty + dy));                
    }



Может стоит выводить графики через QWT ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Cergey
  опции профиля:
сообщение 8.8.2009, 18:22
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 62
Регистрация: 18.10.2008
Пользователь №: 395

Спасибо сказали: 3 раз(а)




Репутация:   1  


Вообще для работы с каждым пикселем используется класс QImage. Быстрее его уже нельзя!!!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 8.8.2009, 19:08
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

Спасибо сказали: 29 раз(а)




Репутация:   5  


Вообще, дело ведь в том, что рисовать нужно только то, что пользователь увидит. Т.е. отсчет ненужное изначально. А затем- правильно продумать КАК мы будем это рисовать. Кэширование, дв. буфф и т.п.

Имхо, сабж нужно повернуть в это русло, а не как убыстрить вывод 50к точек.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
pirks
  опции профиля:
сообщение 8.8.2009, 20:59
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 5.7.2009
Пользователь №: 876

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(ufna @ 8.8.2009, 20:08) *
Вообще, дело ведь в том, что рисовать нужно только то, что пользователь увидит. Т.е. отсчет ненужное изначально. А затем- правильно продумать КАК мы будем это рисовать. Кэширование, дв. буфф и т.п.

Имхо, сабж нужно повернуть в это русло, а не как убыстрить вывод 50к точек.



Да что вертеть, если есть уже написанные и отлаженные модули по выводу графиков и диограм ))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 15.8.2009, 10:28
Сообщение #10


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Цитата(ufna @ 8.8.2009, 20:08) *
Вообще, дело ведь в том, что рисовать нужно только то, что пользователь увидит. Т.е. отсчет ненужное изначально. А затем- правильно продумать КАК мы будем это рисовать. Кэширование, дв. буфф и т.п.

Имхо, сабж нужно повернуть в это русло, а не как убыстрить вывод 50к точек.


ну, я в это русло и повернут) в вроде бы все принципиальные вопросы продумал... 50к уже не вывожу))

такой вопрос - если я использую в качестве контекста рисования картинку (на которой делаю drawLine, drawPoint, drawRect а потом ее рисую )- то какую картинку быстрее использовать? QImage или QPixmap ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 20.6.2025, 23:22