![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Это DoubleBuffered виноват?
SPeller © (2002-11-17 16:35:00)Решил я ради интереса поставить счётчик отрисовки своего контрола и просто-напросто офигел: при показе/активизации гланой формы он рисовался 28 раз; при каждом обновлении - 2 раза. Обновления по 6 раз происходили если обновлялся родитель, а сам контрол был закрыт другим окном, так же 2 раза при показе окна другого приложения поверх всего родителя без передвижений.
Вобщем, надо что-то делать, потому что при большом количестве DoubleBuffered компонентов вполне реально получить тормоза очень и очень большие.
SPeller (2002-11-25 15:34:00) [1]Ну вот, нашёл хорошую замену DoubleBuffered: ручное обновление окон при каждом действии, которое изменяет хоть как-то окно контрола. В моём случае - обновление окон в ScrollBox"е. Всё очень просто:
procedure TfrmMain.SBoxScroll(Sender: PControl; Bar: TScrollerBar; ScrollCmd, ThumbPos: Cardinal);
var i: Integer;
begin
Panel.Update;
for i := 0 to Panel.ChildCount - 1 do begin
Panel.Children[i].Update;
end;
end;
Работает быстро и контролы не размазываются при скроллинге.
SPeller (2002-11-25 13:00:00) [2]Вот пример отрисовки "колоды":
http://spellersoft.narod.ru/doublebuffered.gif
Код отрисовки такой:
procedure TSPLPicture.PanelOnPaint( Sender: PControl; DC: HDC );
var r: TRect; oldObj, tmDC, tmBmp: Cardinal;
begin
r := MakeRect( 0, 0, fPanel.ClientWidth + 0, fPanel.ClientHeight + 2 );
tmDC := CreateCompatibleDC( DC );
tmBmp := CreateCompatibleBitmap( DC, r.Right, r.Bottom );
oldObj := SelectObject( tmDC, tmBmp );
FillRect( tmDC, r, fPanel.Canvas.Brush.Handle );
if not fBitmap.Empty then fBitmap.Draw( tmDC, 0, 0 );
BitBlt( DC, 0, 0, r.Right, r.Bottom, tmDC, 0, 0, SRCCOPY );
SelectObject( tmDC, oldObj );
DeleteDC( tmDC );
DeleteObject( tmBmp );
end;
Результат интересный, но таких фокусов мы не заказывали...
tamerlan311 (2002-11-20 17:37:00) [3]<A
href=" http://www.hhc.boom.ru\kol_components\KOL_HHC_Unit_v1.0.zip</A>
tamerlan311 (2002-11-20 17:33:00) [4]по моим наблюдениям при отрисовке с двойной буфферизацией сначало приходит сообщение просто об отрисовке , потом об отрисовке с заданным контекстом устройства (hdc-приходит), причем после этого не отрисовываются места поверх которых должны находиться другие контролы , это вызывает проблему с непрямоугольными кнопками см www.hhc.boom.ru\kol_components\KOL_HHC_Unit_v1.0.zip
Alexander (2002-11-19 18:39:00) [5]Да ...
Действительно подтормаживает! (да и глючит с отрисовкой)
SPeller (2002-11-18 14:18:00) [6]ЗЗЫ: И когда вставите рисунок, не забудьте по скроллбару пощёлкать :-)
SPeller (2002-11-18 14:17:00) [7]ЗЫ: Контрол - панелька в самом низу, в неё через правую кнопку мона вставить рисунок, но вто как он там вставится - сами увидите.
SPeller (2002-11-18 14:15:00) [8]Вот пример результата моего, правда без "колоды", т.к. рисую в OnMessage по WM_PAINT. Отрисовок в 2 раза меньше. Сам контрол не doublebuffered.
http://spellersoft.narod.ru/sample.rar
SPeller (2002-11-18 14:10:00) [9]Ещё глюк - щёлкаю по скроллбару в самом верху формы (форма во весь экран), а контрол мой в самом низу, на каждый клик вместе со скроллбаром отрисовывался туеву хучу раз.
Надо что-то делать с этим DoubleBuffered.
SPeller (2002-11-18 13:57:00) [10]Заметил так же ещё и такую вещь, что передаваемый в OnPaint DC принимает разные значения. При этом отрисовка на экране получается весьма странной - сначала рисуется одно изображение нормально, а поверх него такое же, но смещённое по диагонали на 3 пикселя, и получается как бы колода из 2-х карт.
SPeller (2002-11-18 01:54:00) [11]
> Я тормоза давно заметил. Хоть и машина не слабая: P4-1500
> и 512 оперативки
А у меня PMMX-200 128 оператиивки :) Я малейшие тормоза и погрешности вижу :-))
Alexander (2002-11-17 21:37:00) [12]Я тормоза давно заметил. Хоть и машина не слабая: P4-1500 и 512 оперативки, но когда ставишь для двух компонент DoubleBuffered (они содержат кучу других компонент и занимают всю форму), то начинает подтормаживать заметно при интенсивном изменении разиеров формы (таскании за правый нижний угол).
Приходится мирится, так как без этого появляется мерцание ...
Хотя я не против оптимизации :)))