Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Ускорение вывода графики


Автор: CrazyDaver 2.5.2011, 05:59
Нужно как можно быстрее вывести bitmap на canvas DrawGrid'а. Стандартный BitBlt не даёт нужной скорости. Как это сделать?
Поможет ли использование библиотек (DelphiX, FastLib, DIBUltra, Graphics32...)?

Автор: Dimonka2 2.5.2011, 17:13
Цитата

Поможет ли использование библиотек (DelphiX, FastLib, DIBUltra, Graphics32...)? 

Не поможет. 

Как рисовал и как измерял скорость рисования?

Автор: CrazyDaver 3.5.2011, 07:39
Цитата(Dimonka2 @  2.5.2011,  17:13 Найти цитируемый пост)
Не поможет.

А что, у них слишком маленький прирост скорости?
Поможет ли использование встроенной в Delphi библиотеки OpenGL?

Цитата(Dimonka2 @  2.5.2011,  17:13 Найти цитируемый пост)
Как рисовал и как измерял скорость рисования?

В памяти нарисован bitmap (около 1000х1000 точек), с которого в OnDrawCell копируется небольшая область (16х16 точек) в каждую ячейку с помощью BitBlt.
Скорость никак не измерял. Проблема в том, что при скроллинге таблицы мерцает крайний столбец или строка в той стороне, куда направлен скроллинг.
Двойная буферизация помогает, но появляются тормоза, и теперь при скроллинге вместо мерцания в крайних ячейках видно как поверх старых bitmap'ов заметно медленно рисуются новые. 

Автор: Dimonka2 3.5.2011, 10:55
Цитата

А что, у них слишком маленький прирост скорости?
Поможет ли использование встроенной в Delphi библиотеки OpenGL?

Дело не в скорости методов, а в подходе. Если ты хочешь пользоваться DrawGrid-ом, то никакие библиотеки тебе ничего не ускорят.

Цитата

Проблема в том, что при скроллинге таблицы мерцает крайний столбец или строка в той стороне, куда направлен скроллинг.

Мерцание означает, что срабатяет ещё одна перерисовка. Т.е. до того как ты рисуешь. DrawGrid рисует там тоже. 

Можно попробовать написать наследника грида и изменить его поведение. Быстрее чем обычный BitBlt всё равно никакая библиотека в гриде не нарисует.

Автор: CrazyDaver 3.5.2011, 12:20
Цитата(Dimonka2 @  3.5.2011,  10:55 Найти цитируемый пост)
Мерцание означает, что срабатяет ещё одна перерисовка. Т.е. до того как ты рисуешь. DrawGrid рисует там тоже. 

Это как раз и странно. DrawGrid, когда я начинал писать программу, при скроллинге или перекрытии формы другим окном сам не запускал событие перерисовки ячейки. Пришлось добавить свою перерисовку в событие формы OnPaint. Теперь же, я полностью удалил всё из OnPaint, и всё равно DrawGrid перерисовывается. Я полностью проверил код программы - ничто не может его перерисовывать.

Автор: Dimonka2 4.5.2011, 13:55
Цитата

Я полностью проверил код программы - ничто не может его перерисовывать. 

Смотри события грида Wm_Paint, Wm_EraseBackground итд. Наверняка там куча всего интересного происходит. 

Рекомендую наследоваться от чего-нибудь типа TCustomDrawGrid и сделать свою правильную реализацию. Почитай о том как создавать компоненты, как регистрировать компоненты итд. Всё прекрасно будет рисоваться без всяких directx или opengl

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)