Конференция "Прочее" » Двойная буфферизация(выдернуто из "Вакансия Delphi программист")
 
  • oxffff © (23.03.08 19:48) [60]

    > без буфера в каждом DC :)


    oxffff ©   (23.03.08 19:45) [58]
  • Игорь Шевченко © (23.03.08 19:52) [61]
    oxffff ©   (23.03.08 19:32) [53]


    > Во всяком случае bitmap obj есть для display DC. Разговор
    > начался ведь с этого.


    Про display dc разговора не было вообще. Был разговор про DC окна.

    Что есть у Display DC - то совершенно другой случай.

    Вот скажи, когда в моем и в твоем примере делался StrectBlt куда биты пересылались ? В буфер конкретного DC (формы в данном случае) или в буфер растра после всех отсечений ?
    А если бы часть окна, где расположен PaintBox была бы закрыта, куда бы биты пересылались (или не пересылались)
  • oxffff © (23.03.08 19:57) [62]

    > Про display dc разговора не было вообще. Был разговор про
    > DC окна.
    >Что есть у Display DC - то совершенно другой случай.


    А как же это? :)

    Display Device Contexts
    An application obtains a display DC by calling the BeginPaint, GetDC, or GetDCEx function and identifying the window in which the corresponding output will appear. Typically, an application obtains a display DC only when it must draw in the client area. When the application is finished drawing, it must release the DC by calling the EndPaint or ReleaseDC function.

    There are three types of DCs for video displays:

    Class
    Common
    Private
  • oxffff © (23.03.08 20:00) [63]

    > Вот скажи, когда в моем и в твоем примере делался StrectBlt
    > куда биты пересылались ? В буфер конкретного DC (формы в
    > данном случае) или в буфер растра после всех отсечений ?
    >


    Это зависит от того, эмулирует ли Windows операции, и если ДА, то какие.
  • Дмитрий С (23.03.08 20:02) [64]

    > oxffff

    А если, к примеру, окно отображается через терминал RDP, то буферов еще больше?
    Все же, я думаю, что понятие DoubleBuffered VCL не включает в себя буферы системы.
  • oxffff © (23.03.08 20:04) [65]

    > Игорь Шевченко ©   (23.03.08 19:52) [61]


    Скажите если по вашему все операции GDI идут без буфера к видеопамять.

    Зачем придумали DIRECTDRAW?
  • oxffff © (23.03.08 20:06) [66]

    > А если, к примеру, окно отображается через терминал RDP,
    >  то буферов еще больше?


    см Common Device Contexts
  • Игорь Шевченко © (23.03.08 20:07) [67]
    oxffff ©   (23.03.08 19:57) [62]

    Продолжим  дальше ?
    var
     DC: HDC;
     HBM: HBitmap;
     Info: tagBITMAP;
    begin
    .....
       HBM := GetCurrentObject(DC, OBJ_BITMAP);
       GetObject(HBM, Sizeof(Info), @Info);
       ShowMessageFmt('Bitmap is %d x %d', [Info.bmWidth, Info.bmHeight]);
    ...
    end;

    oxffff ©   (23.03.08 19:57) [62]


    > А как же это? :)


    Давайте отличать DC, созданные по CreateDC ('DISPLAY', ...) и оконные.
    Дабы не было путаницы, договоримся, что Display dc - это то, что создается по CreateDC
  • oxffff © (23.03.08 20:10) [68]

    > Игорь Шевченко ©   (23.03.08 19:52) [61]


    и КАК ЖЕ [58]?

    Один Буфер c рабочий стол или несколько, но он есть.
    Вы посмотрите внимательно на ваш пример с CS_OWNDC, можно скопировать даже больше, чем окно с CS_OWNDC.
  • Eraser © (23.03.08 20:10) [69]
    > [64] Дмитрий С   (23.03.08 20:02)


    > А если, к примеру, окно отображается через терминал RDP,
    > то буферов еще больше?

    ребята создавшие RDP проделали отличную работу в плане кэширования, вот там многое, даже почти все, действиетельно кэшируется.. подобие такого механизма реализовано и в моем продукте, но примитивнее.
    попробуйте отключить кэширования и посмотрите каким плачевным станет результат.

    > oxffff ©

    отвечу чуть позже.
  • Игорь Шевченко © (23.03.08 20:13) [70]
    oxffff ©   (23.03.08 20:00) [63]


    > Это зависит от того, эмулирует ли Windows операции, и если
    > ДА, то какие.


    Хорошо, русть не StretchBlt, пусть BitBlt, которую операцию умеет каждый драйвер.

    Куда биты будут пересылаться в случае, когда часть окна закрыта и в случае, когда она открыта ?
    И почему при изменении перекрытия окна другими окнами Windows посылает WM_PAINT тому окну, часть которого стала видимой, если оно уже было отрисовано в DC (OWN_DC) ?

    unit main;

    interface
    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, StdCtrls;

    type
     TForm1 = class(TForm)
       Label1: TLabel;
       Label2: TLabel;
       ListBox1: TListBox;
       procedure WMPaint (var Message: TWMPaint); message WM_PAINT;
     protected
       procedure CreateParams (var Params: TCreateparams); override;
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.dfm}

    { TForm1 }

    procedure TForm1.CreateParams(var Params: TCreateparams);
    begin
     inherited;
     Params.WindowClass.style := Params.WindowClass.style or CS_OWNDC;
    end;

    procedure TForm1.WMPaint(var Message: TWMPaint);
    begin
     ListBox1.Items.Add('WM_PAINT');
     inherited;
    end;

    end.



    Если поверх этого окна перемещать другое, то видна последовательность WM_PAINT.

    Нафига их выдают ?
  • Игорь Шевченко © (23.03.08 20:14) [71]
    oxffff ©   (23.03.08 20:10) [68]


    > и КАК ЖЕ [58]?


    А ты посмотри, какие характеристики у этого BITMAP
  • oxffff © (23.03.08 20:15) [72]

    > Игорь Шевченко ©   (23.03.08 20:07) [67]
    > oxffff ©   (23.03.08 19:57) [62]
    >
    > Продолжим  дальше ?
    > var
    >  DC: HDC;
    >  HBM: HBitmap;
    >  Info: tagBITMAP;
    > begin
    > .....
    >    HBM := GetCurrentObject(DC, OBJ_BITMAP);
    >    GetObject(HBM, Sizeof(Info), @Info);
    >    ShowMessageFmt('Bitmap is %d x %d', [Info.bmWidth, Info.
    > bmHeight]);
    > ...
    > end;


    OK. Ваш код не работает.
    Только исправляйте свой код на

    if GetObject(Hobj, Sizeof(Info), @Info)<>0 then  
      ShowMessageFmt('Bitmap is %d x %d', [Info.bmWidth, Info.bmHeight]);
  • oxffff © (23.03.08 20:20) [73]

    > Если поверх этого окна перемещать другое, то видна последовательность
    > WM_PAINT.
    >
    > Нафига их выдают ?


    А что при установке CS_OWNDC семантика поведения окна меняется?
    Почему вы связываете вид DC и ОКНО?
  • oxffff © (23.03.08 20:22) [74]

    > Куда биты будут пересылаться в случае, когда часть окна
    > закрыта и в случае, когда она открыта ?


    А что насчет CLIP RECT и regions?
  • oxffff © (23.03.08 20:24) [75]
    Игорь Шевченко ©   (23.03.08 20:14) [71]

    Сформулируйте точно вашу точку зрения.
    Как происходит работа GDI словами.
  • Игорь Шевченко © (23.03.08 20:33) [76]
    oxffff ©   (23.03.08 20:15) [72]


    > OK. Ваш код не работает.


    Э...а почему ? :) Вроде как битмап вынутый из DC.. (И действительно, битмап, проверено. Только вот вызов GetObject говорит A call to OS function failed)

    oxffff ©   (23.03.08 20:20) [73]


    > А что при установке CS_OWNDC семантика поведения окна меняется?


    Так рисовать-то по твоей логике не надо.
    При CS_SAVEBITS, например, рисование меняется.

    oxffff ©   (23.03.08 20:22) [74]


    > А что насчет CLIP RECT и regions?


    так они на что действуют-то ? На буфер DC или на буфер растра ?
  • Игорь Шевченко © (23.03.08 20:38) [77]
    oxffff ©   (23.03.08 20:24) [75]


    > Сформулируйте точно вашу точку зрения.
    > Как происходит работа GDI словами.


    Это хорошая просьба, боюсь, что для ответа на нее у меня не хватит ни знаний, ни времени, ни места на форуме.

    Но в двух словах. если говорить о DC и об окнах, то буфер есть у растра, весьма вероятно, что физически оно живет у того самого DC, который по CreateDC('DISPLAY') создается. Все оконные DC представляют "окна" (пардон за тавтологию) в этот буфер, с границами, определямыми регионами отсечения.
  • Eraser © (23.03.08 20:40) [78]
    > [58] oxffff ©   (23.03.08 19:45)

    ну привязан какой-то битмап к контексту для непонятных целей и что дальше, это не значит, что в этом битмапе хранится картинка окна.

    http://img201.imageshack.us/my.php?image=compatabedcec7.gif (с) Фэнь Юань.

    вообще очень советую почитать 5 главу этой книги, там все подробно описано.
  • oxffff © (23.03.08 21:33) [79]

    > ну привязан какой-то битмап к контексту для непонятных целей
    > и что дальше, это не значит, что в этом битмапе хранится
    > картинка окна.


    А для каких целей он нужен?
    И что говорит Фэнь Юань?
 
Конференция "Прочее" » Двойная буфферизация(выдернуто из "Вакансия Delphi программист")
Есть новые Нет новых   [134433   +22][b:0.001][p:0.001]