![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Тормозит отрисовка на 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