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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопросы по DrawGrid, вывод графики 
:(
    Опции темы
CrazyDaver
Дата 27.4.2011, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В каждой ячейке DrawGrid'а рисуется определённый bitmap. При скроллинге таблицы заметно мерцает первый или последний столбец или строка, в зависимости от направления скроллинга. 
Каждый bitmap состоит из 2 или 3 слоёв bitmap'ов с альфа-каналами. Рисую всё в памяти с помощью BitBlt и TransparentBlt (копирую нужные области из более крупных bitmap'ов), потом вывожу BitBlt'ом или StretchBlt'том готовый bitmap на canvas DrawGrid'а. 

Как избавится от мерцания, и, по возможности, ускорить отрисовку?

Есть ещё одна проблема:
Раньше при перекрытии формы другим окном часть canvas'а стиралась. Потом прописал в OnPaint перерисовку, и всё стало нормально. Теперь, когда убираю перерисовку, то окно всё равно обновляется. 

В чём дело?

PM MAIL   Вверх
Frees
Дата 27.4.2011, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

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



Попробуй рисовать в событии DrawGrid'а - OnDrawCell.
для ускорения храни многослойную результирующую картинку и выводи ее н а канву в  OnDrawCell.


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
CrazyDaver
Дата 27.4.2011, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я в OnDrawCell и рисую, и вывожу на canvas там же.
С хранением сложнее, т.к. накладываются слои в зависимости от параметра, который контролирует пользователь (могут быть наложены все слои, только один или два любых слоя), т.е. для всех состояний нужно от трёх (2 слоя) до семи (3 слоя) огромных (около 1000х1000 точек) bitmap'ов.

PM MAIL   Вверх
Frees
Дата 27.4.2011, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

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



Цитата(CrazyDaver @  27.4.2011,  17:39 Найти цитируемый пост)
С хранением сложнее, т.к. накладываются слои в зависимости от параметра, который контролирует пользователь (могут быть наложены все слои, только один или два любых слоя), т.е. для всех состояний нужно от трёх (2 слоя) до семи (3 слоя) огромных (около 1000х1000 точек) bitmap'ов.


Что касается ускорения - суть такакя.
для каждой ячейки  создаем Битмап (Хранилище)
при смене параметров пользователем, рисуешь многослойную картинку ,не на Canvas DrawGrid'а! а на Хранилище, и вызываем DrawGrid1.Invalidate;
в событии OnDrawCell просто рисуешь битмап хранилище на Canvas DrawGrid'а.

Убрать мерцание можно попробовать с помощью

Код

Form1.DoubleBuffered := True;

или
http://www.delphisources.ru/pages/faq/base..._twinkling.html

Это сообщение отредактировал(а) Frees - 28.4.2011, 12:43


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
CrazyDaver
Дата 27.4.2011, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Убрать мерцание можно попробовать с помощью
Form1.DoubleBuffered := True;
или
http://www.delphisources.ru/pages/faq/base..._twinkling.html

Уже пробовал, не помогает.

С хранилищем можно попробовать. 
А возможно ускорить само рисование в памяти, накладывание слоёв, например, scanline'ом каким-нибудь или чем-то ещё?
PM MAIL   Вверх
CrazyDaver
Дата 28.4.2011, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Frees @  27.4.2011,  14:50 Найти цитируемый пост)
Что касается ускорения - суть такакя.для каждой ячейки  создаем Битмап (Хранилище)присмене параметров пользователем рисуешь многослойную картинку(не на Canvas DrawGrid'а!), и вызываем DrawGrid1.Invalidate;в событии OnDrawCell просто рисуешь битмап хранилище на Canvas DrawGrid'а.

После того, как сделал буферный bitmap для всей таблицы, и в OnDrawCell стал копировать из него нужную область, мерцание стало немного поменьше. 
После DrawGrid.DoubleBuffered:=True заметного мерцание вообще не стало.

Frees, спасибо за помощь!


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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