Главная страница
    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.47 MB
Время: 0.01 c
3-100607
sergt
2003-07-09 16:31
2003.07.31
wm_user


1-100778
Bosh
2003-07-16 02:29
2003.07.31
странный обход каталогов


3-100639
Vlad451
2003-07-10 16:08
2003.07.31
DBGrid - сделать активной строку, не прибегая к Click


14-100986
Delphi5.01
2003-07-16 06:51
2003.07.31
авторизация TIdHTTP


3-100587
skyzero
2003-07-08 17:18
2003.07.31
Mysql+Delphi?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский