Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.09.20;
Скачать: CL | DM;

Вниз

Частая перерисовка 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
2-1248105605
rogi
2009-07-20 20:00
2009.09.20
кодировка строк?


15-1248422799
GanibalLector
2009-07-24 12:06
2009.09.20
Win2003 ограничение запуска приложения


2-1247646301
MZG
2009-07-15 12:25
2009.09.20
Форматирование диска


2-1248180547
artemm
2009-07-21 16:49
2009.09.20
подсчет одинаковых строк


2-1247549864
Cyberdeity
2009-07-14 09:37
2009.09.20
Корень квадратный