Текущий архив: 2003.07.31;
Скачать: CL | DM;
ВнизЭто DoubleBuffered виноват? Найти похожие ветки
← →
SPeller (2002-11-17 16:35) [0]Решил я ради интереса поставить счётчик отрисовки своего контрола и просто-напросто офигел: при показе/активизации гланой формы он рисовался 28 раз; при каждом обновлении - 2 раза. Обновления по 6 раз происходили если обновлялся родитель, а сам контрол был закрыт другим окном, так же 2 раза при показе окна другого приложения поверх всего родителя без передвижений.
Вобщем, надо что-то делать, потому что при большом количестве DoubleBuffered компонентов вполне реально получить тормоза очень и очень большие.
← →
Alexander (2002-11-17 21:37) [1]Я тормоза давно заметил. Хоть и машина не слабая: P4-1500 и 512 оперативки, но когда ставишь для двух компонент DoubleBuffered (они содержат кучу других компонент и занимают всю форму), то начинает подтормаживать заметно при интенсивном изменении разиеров формы (таскании за правый нижний угол).
Приходится мирится, так как без этого появляется мерцание ...
Хотя я не против оптимизации :)))
← →
SPeller (2002-11-18 01:54) [2]
> Я тормоза давно заметил. Хоть и машина не слабая: P4-1500
> и 512 оперативки
А у меня PMMX-200 128 оператиивки :) Я малейшие тормоза и погрешности вижу :-))
← →
SPeller (2002-11-18 13:57) [3]Заметил так же ещё и такую вещь, что передаваемый в OnPaint DC принимает разные значения. При этом отрисовка на экране получается весьма странной - сначала рисуется одно изображение нормально, а поверх него такое же, но смещённое по диагонали на 3 пикселя, и получается как бы колода из 2-х карт.
← →
SPeller (2002-11-18 14:10) [4]Ещё глюк - щёлкаю по скроллбару в самом верху формы (форма во весь экран), а контрол мой в самом низу, на каждый клик вместе со скроллбаром отрисовывался туеву хучу раз.
Надо что-то делать с этим DoubleBuffered.
← →
SPeller (2002-11-18 14:15) [5]Вот пример результата моего, правда без "колоды", т.к. рисую в OnMessage по WM_PAINT. Отрисовок в 2 раза меньше. Сам контрол не doublebuffered.
http://spellersoft.narod.ru/sample.rar
← →
SPeller (2002-11-18 14:17) [6]ЗЫ: Контрол - панелька в самом низу, в неё через правую кнопку мона вставить рисунок, но вто как он там вставится - сами увидите.
← →
SPeller (2002-11-18 14:18) [7]ЗЗЫ: И когда вставите рисунок, не забудьте по скроллбару пощёлкать :-)
← →
Alexander (2002-11-19 18:39) [8]Да ...
Действительно подтормаживает! (да и глючит с отрисовкой)
← →
tamerlan311 (2002-11-20 17:33) [9]по моим наблюдениям при отрисовке с двойной буфферизацией сначало приходит сообщение просто об отрисовке , потом об отрисовке с заданным контекстом устройства (hdc-приходит), причем после этого не отрисовываются места поверх которых должны находиться другие контролы , это вызывает проблему с непрямоугольными кнопками см www.hhc.boom.ru\kol_components\KOL_HHC_Unit_v1.0.zip
← →
tamerlan311 (2002-11-20 17:37) [10]<A
href=" http://www.hhc.boom.ru\kol_components\KOL_HHC_Unit_v1.0.zip </A>
← →
SPeller (2002-11-25 13:00) [11]Вот пример отрисовки "колоды":
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;
Результат интересный, но таких фокусов мы не заказывали...
← →
SPeller (2002-11-25 15:34) [12]Ну вот, нашёл хорошую замену 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;
Работает быстро и контролы не размазываются при скроллинге.
Страницы: 1 вся ветка
Текущий архив: 2003.07.31;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.008 c