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

    > oxffff ©   (23.03.08 23:08) [98]


    Или делается копия в этом случае в RAM <--> VIDEO RAM.
  • Игорь Шевченко © (23.03.08 23:15) [101]
    oxffff ©   (23.03.08 23:08) [98]


    > А как быть если часть операций поддерживается, а часть нет.
    >
    > Часть операций видеокартой в VIDEO буфере, а часть в RAM
    > буфере,
    > Как  потом смешивать результаты? :)))))))


    То, что не поддерживается, рисуется в буфере растра, потом они смешиваются. Адаптером.
  • oxffff © (23.03.08 23:23) [102]

    > Игорь Шевченко ©   (23.03.08 23:15) [101]


    Увы это можно сделать только для части операций.
    Операции могут иметь зависимости.  :)
  • oxffff © (23.03.08 23:27) [103]

    > Eraser ©   (23.03.08 23:10) [99]
    > > [97] oxffff ©   (23.03.08 23:05)
    >
    > пардон, моя вина.. невнимательность, но суть дела это не
    > поменяло.. даже если заменить WindowName = 'DMClient'; на
    > WindowName = 'Form2'; эффект тот же - скрытая часть окна
    > не копируется.


    Однако если свернуть окно, то копируется начиная с несвернутого положения.
    Однако по данному примеру нельзя сделать вывод о количестве буферов или их отсутствии до попадания в front video buf.
  • Игорь Шевченко © (23.03.08 23:32) [104]
    oxffff ©   (23.03.08 23:23) [102]


    > Увы это можно сделать только для части операций.
    > Операции могут иметь зависимости.  :)


    GDI тоже не дураки писали и о зависимостях представляют. Очевидно, что если нечто имеет зависимости и это нечто поддерживается аппаратно, а зависимости нет, то выбор делается в пользу целостности. Кроме того, набор функций, которые определяет драйвер, составлялся разработчиками GDI, поэтому зависимости они постарались исключить.
  • Игорь Шевченко © (23.03.08 23:37) [105]
    oxffff ©   (23.03.08 23:27) [103]


    > Однако если свернуть окно, то копируется начиная с несвернутого
    > положения.


    Что подтверждает тезис о том, что DC окна является дыркой в DC экрана. Правда, копируется то, что в данный момент видно с этого несвернутого положения. То есть, с того прямоугольника (или региона), который отсекает часть от общего экрана для DC окна.
  • Eraser © (23.03.08 23:37) [106]
    > [103] oxffff ©   (23.03.08 23:27)


    > Однако если свернуть окно, то копируется начиная с несвернутого
    > положения.

    у меня копируется опять пустое место.

    вот модифицированный пример

    unit Unit2;

    interface

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

    type
     TForm2 = class(TForm)
       Memo1: TMemo;
       Button2: TButton;
       Label1: TLabel;
       Edit1: TEdit;
       Timer1: TTimer;
       procedure Button2Click(Sender: TObject);
       procedure Timer1Timer(Sender: TObject);
     protected
       procedure CreateParams (var Params: TCreateparams); override;
     private
       { Private declarations }
     public
       { Public declarations }
     end;

    var
     Form2: TForm2;

    implementation

    {$R *.dfm}

    procedure TForm2.Button2Click(Sender: TObject);
    begin
     Timer1.Enabled := True;
    end;

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

    procedure TForm2.Timer1Timer(Sender: TObject);
    const
     WindowName = 'Form2';
    var
     //WindowRect: TRect;
     hWnd: THandle;
     bmp: TBitmap;
    begin
     Beep;
     Timer1.Enabled := False;
     hWnd := FindWindow(nil, WindowName);
     //GetWindowRect(hWnd, WindowRect);

     bmp := TBitmap.Create;
     try
       bmp.Width := Width;
       bmp.Height := Height;
       StretchBlt(bmp.Canvas.Handle, 0, 0, Memo1.Width,
         Memo1.Height,
         GetDC(hWnd),
         0, 0, Memo1.Width,
         Memo1.Height, SRCCOPY);
       bmp.SaveToFile('test.bmp');
     finally
       bmp.Free;
     end;
    end;

    end.



    > Однако по данному примеру нельзя сделать вывод о количестве
    > буферов или их отсутствии до попадания в front video buf.

    нет у DC окна никаких буфферов.
  • SPeller (work) (24.03.08 04:31) [107]
    Ну и спор у вас :) Даже если где-то система что-то и буферизует, то на кой ляд программисту gdi об этом знать? Если содержимое окна надо каждый раз перерисовывать, значит нет буфера :) Если буфер есть, то на кой хрен мы каждый раз перерисовывем? :)
  • 31512 (24.03.08 07:52) [108]
    Пора кому-то браться за книжку "О чём спорят на форумах по Delphi".... Я из этой ветки массу новых знаний почерпнул!!!!
  • DVM © (24.03.08 11:43) [109]

    > 31512   (24.03.08 07:52) [108]

    У Фень Юаня то же самое все гораздо более строго и подробно расписано. Правда без учета висты пока. А здесь спор не ради истины, а ради самого спора скорее.
  • oxffff © (24.03.08 13:34) [110]

    > нет у DC окна никаких буфферов.


    Игорь Шевченко ©   (23.03.08 22:01) [82]
  • Игорь Шевченко © (24.03.08 14:25) [111]
    oxffff ©   (24.03.08 13:34) [110]

    Ну все равно ведь нету :) у DC окна...
  • oxffff © (24.03.08 20:17) [112]

    > Игорь Шевченко ©   (24.03.08 14:25) [111]


    Как нету?

    А как же HBM := GetCurrentObject(DC, OBJ_BITMAP);?

    Ведь растр есть. И нет гарантии, что это сразу front поверхность
    Так же как и что это back поверхность.
  • oxffff © (24.03.08 20:20) [113]

    > Игорь Шевченко ©   (24.03.08 14:25) [111]
    > oxffff ©   (24.03.08 13:34) [110]
    >
    > Ну все равно ведь нету :) у DC окна...


    oxffff ©   (22.03.08 14:17) [21]
  • Eraser © (24.03.08 20:24) [114]
    > [112] oxffff ©   (24.03.08 20:17)

    читаем еще раз литературу, оконный DC не совместим с DC, который может рисовать на битмапах.
  • oxffff © (24.03.08 20:26) [115]

    > Eraser ©   (24.03.08 20:24) [114]


    Чего???????
  • oxffff © (24.03.08 20:28) [116]

    > Eraser ©   (24.03.08 20:24) [114]


    Вообще речь во всей ветке шла о количестве буферов перед тем попадет изображение на Front поверхность видеопамяти.
  • oxffff © (24.03.08 20:29) [117]

    > Eraser ©   (24.03.08 20:24) [114]
    > > [112] oxffff ©   (24.03.08 20:17)
    >
    > читаем еще раз литературу, оконный DC не совместим с DC,
    >  который может рисовать на битмапах.


    Ты хочь понял что сказал,
    скажи почему есть битмап в оконном DC? И почему функции Bitblt в примерах выше работают?
  • Eraser © (24.03.08 20:39) [118]
    > [116] oxffff ©   (24.03.08 20:28)


    > Вообще речь во всей ветке шла о количестве буферов перед
    > тем попадет изображение на Front поверхность видеопамяти.

    давай не будем касаться фронт-буфферов, драйверов и т.п., т.к. это совершенно другая тема, мало пересекающаяся с прикладным уровнем DC.

    > скажи почему есть битмап в оконном DC?

    не знаю почему он там есть.

    > И почему функции Bitblt в примерах выше работают?

    как они работают то? копируют ровно то, что есть в экранном контексте, легко доступном через CreateDC(PChar('DISPLAY'), nil, nil, nil);
    ни каких бэк-буфферов в этом битмапе или где либо еще на прикладном уровне я не наблюдал.
    если знаешь, где этот буффер - покажи, не знаешь - о чем тогда спор?
  • oxffff © (24.03.08 20:54) [119]

    > давай не будем касаться фронт-буфферов, драйверов и т.п.
    > , т.к. это совершенно другая тема, мало пересекающаяся с
    > прикладным уровнем DC.


    Речь шла как раз об этом.

    > > скажи почему есть битмап в оконном DC?
    >
    > не знаю почему он там есть.


    А чем ты рисуешь?


    >
    > как они работают то? копируют ровно то, что есть в экранном
    > контексте, легко доступном через CreateDC(PChar('DISPLAY'),
    >  nil, nil, nil);
    > ни каких бэк-буфферов в этом битмапе или где либо еще на
    > прикладном уровне я не наблюдал.
    > если знаешь, где этот буффер - покажи, не знаешь - о чем
    > тогда спор?


    Разговор начался в самом самом начале о количестве буферов перед попаданием из MemDC в окно.
    То что буфер есть можно узнать по
    HBM := GetCurrentObject(DC, OBJ_BITMAP).
    А то что он необычный по провалу при вызове GetObject
 
Конференция "Прочее" » Двойная буфферизация(выдернуто из "Вакансия Delphi программист")
Есть новые Нет новых   [134433   +22][b:0.001][p:0.002]