-
Мне нужно очень часто (порядка 10 раз в секунду) перерисовывать image. Сами понимаете, что он такого не выдерживает и начинает мерцать. Я применил следующие действия: во-первых - form1.DoubleBuffered:=true; во-вторых - image4.ControlStyle:=image4.ControlStyle+[csOpaque ]; После каждого из действий мерцание заметно уменьшалось, и, если раньше на картинку невозможно было смотреть, то теперь она не мерцает иногда даже до 2-3 секунд (по крайней мере не заметно), но все же общая картина слишком не приятна.. Возможно ли что-нибудь еще сделать, чтобы image перерисовывался без мерцаний? Да, забыл еще отметить, что сама картинка создаеться в памяти, и только потом целиком идет на image.
-
Какой функцией вы его перерисовываете? м.б. Refresh или Repaint? тогда придётся их заменить на InvalidateRect +FALSE.
-
> Возможно ли что-нибудь еще сделать, чтобы image перерисовывался > без мерцаний?
Не использовать TImage. Не предназначен он для анимации. Он вообще для рисования не предназначен. Для рисования предназначен TPaintBox.
-
> Не использовать TImage. Не предназначен он для анимации. > Он вообще для рисования не предназначен. Для рисования > предназначен TPaintBox.
Попробовал. Эффект тот же, мерцание присутствует.
> Какой функцией вы его перерисовываете? м.б. Refresh или > Repaint? тогда придётся их заменить на InvalidateRect +FALSE. >
Я новичок в этом деле, поэтому не очень понимаю что именно вы предложили сделать. Можно ли поподробнее, на примере? У меня изображение генерируеться в памяти. Потом идет строка Image4.Picture.Bitmap.Assign(Bitmap); Где Bitmap - это и есть само изображение в памяти. Что именно нужно сделать?
-
> Image4.Picture.Bitmap.Assign(Bitmap);
> Что именно нужно сделать?
убрать TImage, я же сказал. А в методе TPaintBox OnPaint выводить твой битмап на канву оного из памяти с помощью BitBlt(). Обновлять TPaintBox как написали в [1].
-
> 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
public
FBitmap: TBitmap;
end;
var
Form1: TForm1;
implementation
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.
-
только из FormDestroy перенести надо в FormCreate DoubleBuffered := true; и Randomize; - описка.
-
а вот и с 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
public
FBitmap: TBitmap;
end;
var
Form1: TForm1;
implementation
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.
-
Спасибо, сейчас попробую на свой проект перевести. Если что не так, отпишусь.
-
> [7] DVM © (08.07.08 23:10) > а вот и с Invalidate:
А какая разница как вызван код OnPaint ПаинтБокса, напрямую [5] или косвенно [7]? :)
-
> А какая разница как вызван код OnPaint ПаинтБокса, напрямую > [5] или косвенно [7]? :)
Если DoubleBuffered := true; и PaintBox1.ControlStyle := PaintBox1.ControlStyle+[csOpaque ]; убрать то разница будет.
-
> nordic3 (08.07.08 21:57) > > Мне нужно очень часто (порядка 10 раз в секунду) перерисовывать > image.
А с чего появилась такая нужда?
-
Так и не уснул. Жду сообщения о результатах от топикстартера...
-
> Так и не уснул. Жду сообщения о результатах от топикстартера. > ..
:D результат я впринципе получил сразу, только надо было обдумать все мелочи и недочеты, которые появились после замены image на paintbox. Теперь все налажено, работает так как надо. DVM, Спасибо за помощь. Воспользовался кодом [5].
> А с чего появилась такая нужда?
Идет счетчик с важными, часто изменяющимися данными, которые следует в реал-тайм выводить на экран... Пробовал увеличить интервал перерисовки, но эффект получаеться ужасный, со скачками и разрывами... Данные практически моментально изменяються, причем округление или что-либо подобное использовать не желательно..
|