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

Вниз

Image или не Image   Найти похожие ветки 

 
Loginov Dmitry ©   (2006-05-19 09:15) [0]

Можно ли сделать так, чтобы после прорисовки изображения в TImage он не мерцал (и не тормозил)? Например, при рисовании на канве формы или панели (и такое бывает :)), рисование происходит быстро и без каких-либо мерцаний. Можно ли на TImage рисовать также?


 
Gydvin ©   (2006-05-19 09:21) [1]

промежуточный буфер tbitmap, form1.DoubleBuffered:=true;


 
Loginov Dmitry ©   (2006-05-19 09:29) [2]

Gydvin ©   (19.05.06 9:21) [1]
промежуточный буфер tbitmap


Так что, для того чтобы вывести одну точку на Image, я должен использовать дополнительный буфер? Мощно!

(это вариант меня не устраивает)


 
Gydvin ©   (2006-05-19 09:31) [3]

ну тады второй


 
Gydvin ©   (2006-05-19 09:33) [4]


> Так что, для того чтобы вывести одну точку на Image, я должен
> использовать дополнительный буфер? Мощно!

тем более в сабже небыло означена что это строчка


 
Loginov Dmitry ©   (2006-05-19 09:45) [5]

Gydvin ©   (19.05.06 9:31) [3]
ну тады второй


А от второго толков никаких нету - мерцание не устраняется.


 
Gydvin ©   (2006-05-19 10:04) [6]

приведите фрагмент кода


 
ЮЮ ©   (2006-05-19 10:14) [7]

А от второго толков никаких нету - мерцание не устраняется.
<компонен, на котором лежит IMage>.DoubleBuffered:=true;


 
Desdechado ©   (2006-05-19 11:06) [8]

> (это вариант меня не устраивает)
двойная буферизация - стандартный подход
пока отображается одно, на вторую (невидимую) страницу буфера идет отрисовка новой картинки, а потом BitBlt (он очень быстрый)
и, кстати, буфер можно создать один раз, а потом его юзать


 
Gydvin ©   (2006-05-19 12:28) [9]


> и, кстати, буфер можно создать один раз, а потом его юзать

Именно, не вижу, чем он не подходит


 
Loginov Dmitry ©   (2006-05-19 16:02) [10]

Попробовал с буфером - действительно быстрее рисуется (рисую с помощью метода Canvas.Draw()).
Будем знать такие хитрости :))


 
Loginov Dmitry ©   (2006-05-19 16:03) [11]

ЮЮ ©   (19.05.06 10:14) [7]

Счас проверим...


 
Loginov Dmitry ©   (2006-05-19 16:14) [12]

Desdechado ©   (19.05.06 11:06) [8]
двойная буферизация - стандартный подход
пока отображается одно, на вторую (невидимую) страницу буфера идет отрисовка новой картинки, а потом BitBlt (он очень быстрый)
и, кстати, буфер можно создать один раз, а потом его юзать


Сорри, а как пользоваться указанной вами двойной буферизацией? Примерчик, или ссылочку (с BitBlt), pleaze!


 
Gydvin ©   (2006-05-19 16:45) [13]


> Сорри, а как пользоваться указанной вами двойной буферизацией?
>  Примерчик, или ссылочку (с BitBlt), pleaze!


Это про что я говорил в [1]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure FormCreate(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
   buffer: tbitmap;
   procedure risovatel(bitmap: tbitmap; canv: tcanvas);
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 buffer := tbitmap.Create;
 buffer.Width := 200;
 buffer.Height := 200;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 buffer.Free;
end;

procedure TForm1.risovatel(bitmap: tbitmap; canv: tcanvas);
begin
 bitmap.Canvas.Brush.Color := clred;
 bitmap.Canvas.Rectangle(10, 10, 100, 100);
 BitBlt(canv.Handle, 0, 0, bitmap.Width, bitmap.Height, bitmap.canvas.Handle, 0, 0, SRCCOPY);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 risovatel(buffer, canvas);
end;

end.



 
Loginov Dmitry ©   (2006-05-19 19:20) [14]

Сравнил по скорости BitBlt с Canvas.Draw - выигрыш в скорости - нулевой.
Но вот что самое интересное - вывод на экран готового буфера вообще не тратит ресурсов процессора (вывожу на канву панели). А рисование в этом самом буфере - очень даже тратит. Как я понимаю, вывод на экран берет на себя видеокарта, а не процессор.


 
Loginov Dmitry ©   (2006-05-19 20:52) [15]

Еще один вопросик (сорри конечно за мою настырность :)). Мне пришлось отказаться от канвы панели и рисовать на канве TImage в ущерб производительности. Дело в том, что у панели проблемы с перерисовкой (перехватываю событие WM_PAINT) - не всегда событие возникает в нужный момент (иногда не возникает, и часть панели остается затертой). В TImage вся перерисовка выполняется автоматически, за что ей огромное спасибо :).
Вопрос: какое событие нужно перехватывать, чтобы панель перерисовывалась "вовремя"?


 
Gydvin ©   (2006-05-19 21:29) [16]

ручками в onpaint формы


 
Loginov Dmitry ©   (2006-05-19 21:55) [17]

Так нельзя ручками-то. Компонент пишу, как-никак :)


 
Gydvin ©   (2006-05-19 22:19) [18]

а почему не использовать tpaintbox?
Там есть событие onpaint  и на его основе я собирал компонент с перерисовкой, работает на ура


 
Loginov Dmitry ©   (2006-05-19 23:07) [19]

Gydvin ©   (19.05.06 22:19) [18]
а почему не использовать tpaintbox?


Да забыл я про него. А зря...
Попробовал - респект! Все просто летает :)

Сенкс!


 
antonn ©   (2006-05-20 08:36) [20]

на панели не нужно рисовать, это элемент для "форматирования" расположеения контроллов



Страницы: 1 вся ветка

Текущий архив: 2006.06.04;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.047 c
1-1146105828
DF_Slayer
2006-04-27 06:43
2006.06.04
property Shape = stLine


2-1148017662
ZV
2006-05-19 09:47
2006.06.04
Save and Load


2-1147682714
Сергей И
2006-05-15 12:45
2006.06.04
Индексы


4-1142316961
_white_
2006-03-14 09:16
2006.06.04
Чтение из памяти другой программы


2-1148159280
<X>
2006-05-21 01:08
2006.06.04
Получить Index выделеных ячеек.