Форум: "Основная";
Текущий архив: 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