Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ускорение отрисовки графика 
:(
    Опции темы
Hexel
Дата 24.10.2009, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 30.10.2007
Где: UA

Репутация: нет
Всего: нет



еще раз повторюсь: я не умею рисовать на буферном битмапе, поэтому для наглядности метода просто взял 2 паинт бокса

ну хоть теперь я ясно выразил свою идею?

ЗЫ: если не сложно, выклади свой замер производительности. а то мне сложно судить, у меня атлон х2 4200 (2.2ГГц) х ДДР2 800МГц smile его натупило только на 5 лимонов точек (около 3 сек)

и как вообще эта произодительность замеряется? gettickcount?

Это сообщение отредактировал(а) Hexel - 24.10.2009, 00:09
PM MAIL   Вверх
Beltar
Дата 24.10.2009, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 0
Всего: 7



Попробовал я порисовать на буферном битмепе, результат поразителен отсутствием какой-либо разницы от рисования сразу на PaintBox'е, при отключении отрисовки, ни синусы, ни создание и удаление большого битмепа не смогли занять одно ядро E-4500 (2.2 HHz) на время  большее времени выделяемому процессу.

2 Hexel:

Сырец контрола можешь посмотреть. D 2007 Эксперементировал я с твоим примером, получилось вот что.

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  AvgChart.rar 9,06 Kb


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Beltar
Дата 24.10.2009, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 0
Всего: 7



Второй аттач. Да, в контроле там много чего inline помечено, без них по идее должно скомпилиться в семерке, а может и нет.

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  GraphicsTest1.rar 11,64 Kb


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Hexel
Дата 25.10.2009, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 30.10.2007
Где: UA

Репутация: нет
Всего: нет



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

вот ято я хотел сказать после некоторых размышлений. для технической задачи:

1) лучше применить векторную графику. лучше выглядит, проще обрабатывается (например, масштабируется, анализируется), и, главное, легче всего подготавливается в печать.
2) не знаю, что у тебя за график, но иногда его выгодно апроксимировать какой-то функцией, нас так в универе учили. если надо - помогу, у меня с математикой проблем нет. такая фича позволяет устранить посторонние шумы, например несистемные ошибки измерений (график выглядит более гладким). такой график, кстати, можно рисовать кривой Безье, буквально за несколько вызовов.

по второму с выводом не спеши, посоветуйся со спецами

Добавлено через 10 минут и 16 секунд
Delphi6 нискампилил
инлайны поубивал (я, кстати, и не знаю, что это), но обламался на
Код

    //разные внутренние переменные
    FS:TFormatSettings;

([Error] AvgChart.pas(180): Undeclared identifier: 'TFormatSettings')

меня вот мучит вопрос: а что такого прикольного в новых IDE, помимо компонент, которые можно скачать с инета? до сих пор моей 6 мне хватало с головой, еще и оставалось
PM MAIL   Вверх
Hexel
Дата 25.10.2009, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 30.10.2007
Где: UA

Репутация: нет
Всего: нет



насчет моего метода - да, разница в скорости есть. 500 тиков (мс?) для рисования толщиной 5, и 46 тиков  для рисвания той же толщиной (или толщиной 50) с помощью CopyRect. в буфер, потом на паинтбокс

Добавлено через 3 минуты и 6 секунд
при том, как оказалось, ВСЕ это время уходит на LineTo ))))
PM MAIL   Вверх
Beltar
Дата 8.2.2010, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 0
Всего: 7



Так, я-таки решил сделать отрисовку диаграммы на буферном битмепе.

Код

procedure TAvgChart.Draw;
begin
if BlockPaint then Exit;
DrawTrends;//Рисует на битмепе
FastRepaint;//Дорисовка


Код

procedure TAvgChart.FastRepaint;
begin
if BlockPaint then Exit;
Canvas.Pen.Mode:=pmCopy;
Canvas.Draw(0,0,Bmp);
if FSetsRectangles then DrawRectangles;
DrawAxes;
DrawValueLines;
if FInSelection then DrawSelection;
end;


В интересующих случаях (из MouseMove, MouseUp и Click контрола) FastRepaint вызывается напрямую, в отличие от пред. версии ничего не лагает, но зато неприлично мерцает. Все, что после Canvas.Draw(0,0,Bmp); никакого влияния на мерцание не оказывает. Как побороть?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
AntonN
Дата 8.2.2010, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 3
Всего: 18



вместо Canvas.Draw() юзать сразу BitBlt().

что такое вот это?
Код

if FSetsRectangles then DrawRectangles;
DrawAxes;
DrawValueLines;
if FInSelection then DrawSelection;


вся идея в том, чтобы вообще все рисовать на буфере. Если рисование подложки графика ресурсовемко и нечастое, можно использовать два буфера, на первом рисовать подложку, на второй его копировать и наносить маркеры. Если мало - три буфера smile
В итоге вывод на форму будет краток - один вызов BitBlt()


--------------------
user posted image
PM MAIL WWW   Вверх
Beltar
Дата 8.2.2010, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 0
Всего: 7



Обошелся двумя буферами, итоговый код FastRepaint:

Код

procedure TAvgChart.FastRepaint;
begin
if BlockPaint then Exit;
Canvas.Pen.Mode:=pmCopy;
if Assigned(Bmp1) then Bmp1.Free;
Bmp1:=TBitmap.Create;
Bmp1.Width:=Width;
Bmp1.Height:=Height;
Bmp1.Canvas.Draw(0,0,Bmp);
if FSetsRectangles then DrawRectangles;
DrawAxes;
DrawValueLines;
if FInSelection then DrawSelection;
Canvas.Draw(0,0,Bmp1);
end;


В кишках всех этих DrawSomething просто перед каждый канвасом приписал Bmp1. smile Хотя почему так получается мне непонятно, изначально ведь все рисовалось по целевому канвасу и ничего не мерцало, точнее хватало DoubleBuffered чтобы подавить мерцание.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
AntonN
Дата 8.2.2010, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 3
Всего: 18



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

а буферные битмапы и есть буферизация smile


--------------------
user posted image
PM MAIL WWW   Вверх
Beltar
Дата 8.2.2010, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 0
Всего: 7



Цитата

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


if Assigned(Bmp1) then Bmp1.Free;
Если бы тут текло, то у меня, наверное, оперативки хватило бы на несколько минут максимум т. к. терять при каждом движении мышки с зажатой кнопкой экземпляр битмепа размером в пару метров должно быть приличным экстримом. Х)

Хотя при разрушении компонента действительно забыл.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
AntonN
Дата 9.2.2010, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 3
Всего: 18



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


--------------------
user posted image
PM MAIL WWW   Вверх
Beltar
Дата 9.2.2010, 02:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 0
Всего: 7



Там лажа с неочисткой битмепа получалась, поэтому не мудрствуя лукаво сделал так.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Mikel
Дата 9.2.2010, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 882
Регистрация: 30.3.2002
Где: Саратов

Репутация: нет
Всего: 2



Для начала попробуй все рисовать в отдельном bitmap буфере, потом bitblt на paintbox. И кстати, зачем рисовать несколько десятков тысяч точек на дисплее с разрешением по Х порядка тысячи точек? Если график на столько подробный, можно рисовать прямо в памяти битмапа, без обращения к APIшному SetPixel. А вообще подумайте стоит ли их все рисовать smile


--------------------
...so remember, it's better to burn out than to fade away
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0532 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.