Конференция "Основная" » Частая перерисовка image... [D7, WinXP]
 
  • nordic3 (08.07.08 21:57) [0]
    Мне нужно очень часто (порядка 10 раз в секунду) перерисовывать image. Сами понимаете, что он такого не выдерживает и начинает мерцать. Я применил следующие действия: во-первых - form1.DoubleBuffered:=true;
    во-вторых - image4.ControlStyle:=image4.ControlStyle+[csOpaque ];
    После каждого из действий мерцание заметно уменьшалось, и, если раньше на картинку невозможно было смотреть, то теперь она не мерцает иногда даже до 2-3 секунд (по крайней мере не заметно), но все же общая картина слишком не приятна.. Возможно ли что-нибудь еще сделать, чтобы image перерисовывался без мерцаний?
    Да, забыл еще отметить, что сама картинка создаеться в памяти, и только потом целиком идет на image.
  • Renegat (08.07.08 22:04) [1]
    Какой функцией вы его перерисовываете? м.б. Refresh или Repaint? тогда придётся их заменить на InvalidateRect +FALSE.
  • DVM © (08.07.08 22:11) [2]

    > Возможно ли что-нибудь еще сделать, чтобы image перерисовывался
    > без мерцаний?

    Не использовать TImage. Не предназначен он для анимации. Он вообще для рисования не предназначен. Для рисования предназначен TPaintBox.
  • nordic3 (08.07.08 22:50) [3]

    > Не использовать TImage. Не предназначен он для анимации.
    >  Он вообще для рисования не предназначен. Для рисования
    > предназначен TPaintBox.

    Попробовал. Эффект тот же, мерцание присутствует.

    > Какой функцией вы его перерисовываете? м.б. Refresh или
    > Repaint? тогда придётся их заменить на InvalidateRect +FALSE.
    >

    Я новичок в этом деле, поэтому не очень понимаю что именно вы предложили сделать. Можно ли поподробнее, на примере?
    У меня изображение генерируеться в памяти. Потом идет строка
    Image4.Picture.Bitmap.Assign(Bitmap);
    Где Bitmap - это и есть само изображение в памяти.
    Что именно нужно сделать?
  • DVM © (08.07.08 22:55) [4]

    > Image4.Picture.Bitmap.Assign(Bitmap);


    > Что именно нужно сделать?

    убрать TImage, я же сказал. А в методе TPaintBox OnPaint выводить твой битмап на канву оного из памяти с помощью BitBlt(). Обновлять TPaintBox как написали в [1].
  • DVM © (08.07.08 23:04) [5]

    > nordic3

    вот ничего не мерцает, только я без Invalidate обошелся.


    unit Unit1;

    interface

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

    type
     TForm1 = class(TForm)
       Timer1: TTimer;
       PaintBox1: TPaintBox;
       procedure FormCreate(Sender: TObject);
       procedure FormDestroy(Sender: TObject);
       procedure Timer1Timer(Sender: TObject);
       procedure PaintBox1Paint(Sender: TObject);
     private
       { Private declarations }
     public
       FBitmap: TBitmap;
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
     FBitmap := TBitmap.Create;
     FBitmap.Width := 200;
     FBitmap.Height := 200;
     FBitmap.PixelFormat := pf24bit;
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
     DoubleBuffered := true;
     FBitmap.Free;
     Randomize;
    end;

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
     PaintBox1Paint(nil);
    end;

    procedure TForm1.PaintBox1Paint(Sender: TObject);
    var
     x, y: integer;
    begin
     x := round(random(200));
     y := round(random(200));
     FBitmap.Canvas.Pixels[x, y] := clRed;
     self.Canvas.Draw(0, 0, FBitmap);
    end;

    end.


  • DVM © (08.07.08 23:05) [6]
    только из FormDestroy перенести надо в FormCreate DoubleBuffered := true; и Randomize; - описка.
  • DVM © (08.07.08 23:10) [7]
    а вот и с Invalidate:


    unit Unit1;

    interface

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

    type
     TForm1 = class(TForm)
       Timer1: TTimer;
       PaintBox1: TPaintBox;
       procedure FormCreate(Sender: TObject);
       procedure FormDestroy(Sender: TObject);
       procedure Timer1Timer(Sender: TObject);
       procedure PaintBox1Paint(Sender: TObject);
     private
       { Private declarations }
     public
       FBitmap: TBitmap;
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
     Randomize;
     DoubleBuffered := true;
     FBitmap := TBitmap.Create;
     FBitmap.Width := 200;
     FBitmap.Height := 200;
     FBitmap.PixelFormat := pf24bit;
     PaintBox1.ControlStyle := PaintBox1.ControlStyle+[csOpaque ];
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
     FBitmap.Free;
    end;

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
     PaintBox1.Invalidate;
    end;

    procedure TForm1.PaintBox1Paint(Sender: TObject);
    var
     x, y: integer;
    begin
     x := round(random(200));
     y := round(random(200));
     FBitmap.Canvas.Pixels[x, y] := clRed;
     PaintBox1.Canvas.Draw(0, 0, FBitmap);
    end;

    end.


  • nordic3 (08.07.08 23:14) [8]
    Спасибо, сейчас попробую на свой проект перевести. Если что не так, отпишусь.
  • {RASkov} © (08.07.08 23:22) [9]
    > [7] DVM ©   (08.07.08 23:10)
    > а вот и с Invalidate:

    А какая разница как вызван код OnPaint ПаинтБокса, напрямую [5] или косвенно [7]? :)
  • DVM © (08.07.08 23:26) [10]

    > А какая разница как вызван код OnPaint ПаинтБокса, напрямую
    > [5] или косвенно [7]? :)

    Если DoubleBuffered := true; и PaintBox1.ControlStyle := PaintBox1.ControlStyle+[csOpaque ]; убрать то разница будет.
  • Германн © (09.07.08 01:42) [11]

    > nordic3   (08.07.08 21:57)
    >
    > Мне нужно очень часто (порядка 10 раз в секунду) перерисовывать
    > image.

    А с чего появилась такая нужда?
  • простой (09.07.08 09:24) [12]
    Так и не уснул. Жду сообщения о результатах от топикстартера...
  • nordic3 (09.07.08 12:48) [13]

    > Так и не уснул. Жду сообщения о результатах от топикстартера.
    > ..

    :D результат я впринципе получил сразу, только надо было обдумать все мелочи и недочеты, которые появились после замены image на paintbox. Теперь все налажено, работает так как надо.
    DVM, Спасибо за помощь. Воспользовался кодом [5].

    > А с чего появилась такая нужда?

    Идет счетчик с важными, часто изменяющимися данными, которые следует в реал-тайм выводить на экран... Пробовал увеличить интервал перерисовки, но эффект получаеться ужасный, со скачками и разрывами... Данные практически моментально изменяються, причем округление или что-либо подобное использовать не желательно..
 
Конференция "Основная" » Частая перерисовка image... [D7, WinXP]
Есть новые Нет новых   [134491   +13][b:0][p:0.002]