Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.017 c
3-100605
Шурик Ш
2003-07-09 15:24
2003.07.31
Как задать имя пользователя и пароль программно?


14-100900
Sirus
2003-07-14 08:14
2003.07.31
BIOS не хочет прошиваться...


1-100717
dim-
2003-07-16 16:15
2003.07.31
перерисовка Image


3-100604
Silver_
2003-07-04 17:41
2003.07.31
DETAIL_ADODataSet.IsEmpty


14-100953
passm
2003-07-15 13:57
2003.07.31
Антибликовые очки