Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];

Вниз

свой класс для двухмерных диаграмм. Canvas - медленно.....   Найти похожие ветки 

 
Zilog   (2003-07-09 16:37) [0]

Народ!! Делаю свой класс для отрисовки двухмерных диаграмм. На Canvas рисовать - может работать медленно, если придётся рисовать много линий. Что можете порекомендовать для реализации данной задачи?


 
Morfein   (2003-07-09 17:09) [1]

DirectX


 
Poirot   (2003-07-09 17:12) [2]

OpenGL лучше будет для данной задачи! Докучи он Open!


 
Переяслов Григорий   (2003-07-09 17:25) [3]

Сколько много? Будет работать в реальном времени? Пиши свой компонент.


 
Zilog   (2003-07-10 17:24) [4]

DirectX и OpenGl помоему слишком громоздко для данной задачи.

2 Переяслов Григорий © : Много - зависит от масшаба. Может несколько сотен, может тыща... х.з. Реальное время - очень возможно. И что значит писать свой компонент - графику то как выводить - вот в чём вопрос!


 
Переяслов Григорий   (2003-07-10 17:27) [5]

Есть класс TPaintBox. Есть класс TCanvas. Почитай про них в хелпе, в книжках или в статьях.


 
Zilog   (2003-07-10 17:37) [6]

Дык я им сейчас и вывожу!!! Тормозно это если линий много - да и хрен бы с ним, мерцание бы убрать тогда...


 
Murad   (2003-07-10 17:43) [7]

2Zilog ©
Чтобы убрать мерцание надо либо самому реализовать алгоритм двойной буферизации либо рисовать на панели у которой DoubleBuffered = true


 
iXuSs   (2003-07-10 17:49) [8]

> Тормозно это если линий много - да и хрен бы с ним, мерцание бы убрать тогда...

Это довольно распространённый вопрос о слишком медленном выводе графики стандартными средствами Delphi, в частности, объекта типа TCanvas. Теми же стандартными средствами проблему устранить можно, хотя я бы посоветовал всё-таки воспользоваться посторонними графическими библиотеками, например, Graphic32, где реализовано быстрое рисование линий (с anti-aliasing) или если есть время и желание, то можно использовать OpenGL.

Тем не менее, мерцание можно убрать и иначе. Прежде всего, нужно у того компонента, на котором рисуется изображение, поставить свойство DoubleBuffered в True. Свойство не показывается в Object Inspector, делать это следует вручную.

Далее можно воспользоваться приёмом создания буфера. Идея состоит в том, что ты заводишь некоторое отдельное изображение типа TBitmap, на канве которого рисуешь диаграмму так, как если бы ты рисовал диаграмму на форме или на TPaintBox или на любой другой канве. Далее, по таймеру или в потоке или при OnIdle формы ты выводишь всё изображение, используя не метод Draw, а функцию BitBlt.

В случае, если диаграмму требуется вывести один раз, например, при нажатии кнопки, то вывод конечного изображения следует реализовать не через вышеперечисленные способы, а при OnPaint.


 
Murad   (2003-07-10 17:49) [9]

2Zilog ©
Еще один хороший способ ускорения при большом количестве
объектов - отсечь невидимые элементы по ректу окна. Т.е. не
выводить те элементы пиксельные координаты которых не
попадают в область вывода.


 
Zilog   (2003-07-11 10:51) [10]

2 iXuSs : Пасиб, так и сделал - красота. Единственное что - я хотел сделать так: мышкой можно по графику двигать вертикальную полосу, и выдавать значение на пересечении графиков и этой полосы. В этом случае надо постоянно обнолять изображение, а при больших размерах (примерно 60-70% процентов от общей площади экрана 1024х768) изображение опять начинает притормаживать (пень 3 1ГГц), хотя противного мерцания ессно нет.

Может кто подскажет как можно получить к Bitmap прямой доступ, чтобы на ассемблере програмить?


 
MBo   (2003-07-11 10:54) [11]

В статьи загляни


 
ЮЮ   (2003-07-11 11:33) [12]

>Может кто подскажет как можно получить к Bitmap прямой доступ, чтобы на ассемблере програмить?

Посмотри, всё-таки, Graзрics32. Его ImageView - то, что тебе надо: и сколлирование и zoom. А его Bitmap32 cам имеет методы рисования, подобные Canvas. Плюс слои с AlphaBlending - ом


 
reonid   (2003-07-11 11:53) [13]

Zilog © (11.07.03 10:51)
В таких случаях обычно рисуют линии с помощью инвертирования
изображения, в случае с канвой это Pen.Mode := pmNot.
Нарисовал второй раз на старом месте - стёр.
Затем нарисовал на новом месте.
Никаких перерисовок всего изображения.

Кстати, тысяча элементов - это очень мало.
С чего ты взял, что Сanvas будет тормозить?


 
Skier   (2003-07-11 12:08) [14]

>reonid © (11.07.03 11:53)
Pen.Mode := pmXor;


 
Murad   (2003-07-11 12:24) [15]

2reonid
если Pen.Mode := pmNot , то как же цвет пера...???



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.008 c
3-77800
Demka
2003-07-02 10:58
2003.07.24
select from TQuery


1-77846
MidnightEj
2003-07-12 15:05
2003.07.24
Как считывать значения из ячеек Excel-файла?


1-77988
Вован
2003-07-10 18:13
2003.07.24
Объясните пожалуйста что, возвращает GetDC(0)


1-77878
Sour
2003-07-10 10:45
2003.07.24
Изменение константы в прилложении без перекомпиляции???


1-77985
Tahion2
2003-07-09 21:44
2003.07.24
Как добавить Item в TreeView с 32bpp иконкой, загруженной с файла





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский