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