Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
2-1248097068
Константин
2009-07-20 17:37
2009.09.20
Проблема синхронизации. Подскажите.


1-1216057016
Power Man
2008-07-14 21:36
2009.09.20
Как программно разрешить использование спящего режима?


4-1217761801
kalexi
2008-08-03 15:10
2009.09.20
Как рисовать в статике используя двойную буферизацию?


15-1248110797
Илья_
2009-07-20 21:26
2009.09.20
Это не реклама


3-1227136044
Petr V. Abramov
2008-11-20 02:07
2009.09.20
forall и bulk collect into





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский