Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Тормозит отрисовка на Bitmap-е


AlexeyT ©   (2006-03-21 14:01:00) 

Компонент рисует на Bitmap-е, потом выводит этот битмеп через Canvas.Draw на основную форму. Проблема в том, что отрисовка на битмепе тормозит:

1) При отрисовке большого числа строк теста через Canvas.TextOut (тормозит при числе строк от 200)
2) Особенно тормозит при раскраске фона битмепа таким кодом:
procedure SelectRect(Canvas: TCanvas; const Rect: TRect);
var
 X, Y: integer;
begin
 with Canvas do
   for X:= Rect.Left to Rect.Right-1 do
     for Y:= Rect.Top to Rect.Bottom-1 do
       Pixels[X, Y]:= Pixels[X, Y] xor clWhite;  
end;


(тормозит при числе раскрашенных строк от 5).

Подскажите, что можно тут ускорить? Задача компонента - выводить текст с раскраской фона. Почти то же, что делает TMemo, но TMemo же не тормозит?


ЮЮ   (2006-03-22 12:54:00) [1]


> Почти то же, что делает TMemo, но TMemo же не тормозит?

Он рисует только видимые строки, а ты " (тормозит при числе строк от 200)"


MBo   (2006-03-22 05:49:00) [2]

DrawText может выводить много строк сразу - вот отсюда и может быть выигрыш


AlexeyT   (2006-03-21 22:40:00) [3]

А, sorry, DrawText рисует и на битмепе тоже.
Но она ничем не лучше ExtTextOut, которую использует Canvas.TextOut.
В общем, не знаю, что еще можно оптимизировать. Отрисовка ускоряется, если уменьшить размеры битмепа (сейчас он 1600*1200), но размеры должны быть достаточными для того, чтобы вместить весь экран...

Хорошо бы посмотреть пример компонента, рисующего текст на канве, без тормозов...


AlexeyT   (2006-03-21 19:02:00) [4]


> API-функция DrawText

Т.е. рисовать (через DrawText) придется прямо на контроле, минуя битмеп?
Я-то хотел все нарисовать прямо в битмепе, а потом битмеп выводить на канву контрола...


MBo   (2006-03-21 17:16:00) [5]

>А что делать с первым пунктом?
API-функция DrawText


AlexeyT   (2006-03-21 17:10:00) [6]


> MBo ©   (21.03.06 14:09) [1]

Со вторым пунктом ясно, сделаю через InvertRect или ScanLine.
А что делать с первым пунктом?


MBo   (2006-03-21 14:10:00) [7]

Еще проще - InvertRect


MBo   (2006-03-21 14:09:00) [8]

Pixels[X, Y]:= Pixels[X, Y] xor clWhite;  
Зачем попиксельно делать инверсию - можно сделать одним вызовом bitblt c SRCINVERT


Наверх

Титульная страница Поиск, карта сайта Написать письмо