![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Частая перерисовка image... [D7, WinXP]
nordic3 © (2008-07-08 21:57:00)Мне нужно очень часто (порядка 10 раз в секунду) перерисовывать image. Сами понимаете, что он такого не выдерживает и начинает мерцать. Я применил следующие действия: во-первых - form1.DoubleBuffered:=true;
во-вторых - image4.ControlStyle:=image4.ControlStyle+[csOpaque ];
После каждого из действий мерцание заметно уменьшалось, и, если раньше на картинку невозможно было смотреть, то теперь она не мерцает иногда даже до 2-3 секунд (по крайней мере не заметно), но все же общая картина слишком не приятна.. Возможно ли что-нибудь еще сделать, чтобы image перерисовывался без мерцаний?
Да, забыл еще отметить, что сама картинка создаеться в памяти, и только потом целиком идет на image.
nordic3 (2008-07-09 12:48:00) [1]
> Так и не уснул. Жду сообщения о результатах от топикстартера.
> ..
:D результат я впринципе получил сразу, только надо было обдумать все мелочи и недочеты, которые появились после замены image на paintbox. Теперь все налажено, работает так как надо.
DVM, Спасибо за помощь. Воспользовался кодом [5].
> А с чего появилась такая нужда?
Идет счетчик с важными, часто изменяющимися данными, которые следует в реал-тайм выводить на экран... Пробовал увеличить интервал перерисовки, но эффект получаеться ужасный, со скачками и разрывами... Данные практически моментально изменяються, причем округление или что-либо подобное использовать не желательно..
простой (2008-07-09 09:24:00) [2]Так и не уснул. Жду сообщения о результатах от топикстартера...
Германн (2008-07-09 01:42:00) [3]
> nordic3 (08.07.08 21:57)
>
> Мне нужно очень часто (порядка 10 раз в секунду) перерисовывать
> image.
А с чего появилась такая нужда?
DVM (2008-07-08 23:26:00) [4]
> А какая разница как вызван код OnPaint ПаинтБокса, напрямую
> [5] или косвенно [7]? :)
Если DoubleBuffered := true; и PaintBox1.ControlStyle := PaintBox1.ControlStyle+[csOpaque ]; убрать то разница будет.
{RASkov} (2008-07-08 23:22:00) [5]> [7] DVM © (08.07.08 23:10)
> а вот и с Invalidate:
А какая разница как вызван код OnPaint ПаинтБокса, напрямую [5] или косвенно [7]? :)
nordic3 (2008-07-08 23:14:00) [6]Спасибо, сейчас попробую на свой проект перевести. Если что не так, отпишусь.
DVM (2008-07-08 23:10:00) [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.
DVM (2008-07-08 23:05:00) [8]только из FormDestroy перенести надо в FormCreate DoubleBuffered := true; и Randomize; - описка.
DVM (2008-07-08 23:04:00) [9]
> 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 (2008-07-08 22:55:00) [10]
> Image4.Picture.Bitmap.Assign(Bitmap);
> Что именно нужно сделать?
убрать TImage, я же сказал. А в методе TPaintBox OnPaint выводить твой битмап на канву оного из памяти с помощью BitBlt(). Обновлять TPaintBox как написали в [1].
nordic3 (2008-07-08 22:50:00) [11]
> Не использовать TImage. Не предназначен он для анимации.
> Он вообще для рисования не предназначен. Для рисования
> предназначен TPaintBox.
Попробовал. Эффект тот же, мерцание присутствует.
> Какой функцией вы его перерисовываете? м.б. Refresh или
> Repaint? тогда придётся их заменить на InvalidateRect +FALSE.
>
Я новичок в этом деле, поэтому не очень понимаю что именно вы предложили сделать. Можно ли поподробнее, на примере?
У меня изображение генерируеться в памяти. Потом идет строка
Image4.Picture.Bitmap.Assign(Bitmap);
Где Bitmap - это и есть само изображение в памяти.
Что именно нужно сделать?
DVM (2008-07-08 22:11:00) [12]
> Возможно ли что-нибудь еще сделать, чтобы image перерисовывался
> без мерцаний?
Не использовать TImage. Не предназначен он для анимации. Он вообще для рисования не предназначен. Для рисования предназначен TPaintBox.
Renegat (2008-07-08 22:04:00) [13]Какой функцией вы его перерисовываете? м.б. Refresh или Repaint? тогда придётся их заменить на InvalidateRect +FALSE.