![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Image или не Image
Loginov Dmitry © (2006-05-19 09:15:00)Можно ли сделать так, чтобы после прорисовки изображения в TImage он не мерцал (и не тормозил)? Например, при рисовании на канве формы или панели (и такое бывает :)), рисование происходит быстро и без каких-либо мерцаний. Можно ли на TImage рисовать также?
antonn (2006-05-20 08:36:00) [1]на панели не нужно рисовать, это элемент для "форматирования" расположеения контроллов
Loginov Dmitry (2006-05-19 23:07:00) [2]Gydvin © (19.05.06 22:19) [18]
а почему не использовать tpaintbox?
Да забыл я про него. А зря...
Попробовал - респект! Все просто летает :)
Сенкс!
Gydvin (2006-05-19 22:19:00) [3]а почему не использовать tpaintbox?
Там есть событие onpaint и на его основе я собирал компонент с перерисовкой, работает на ура
Loginov Dmitry (2006-05-19 21:55:00) [4]Так нельзя ручками-то. Компонент пишу, как-никак :)
Gydvin (2006-05-19 21:29:00) [5]ручками в onpaint формы
Loginov Dmitry (2006-05-19 20:52:00) [6]Еще один вопросик (сорри конечно за мою настырность :)). Мне пришлось отказаться от канвы панели и рисовать на канве TImage в ущерб производительности. Дело в том, что у панели проблемы с перерисовкой (перехватываю событие WM_PAINT) - не всегда событие возникает в нужный момент (иногда не возникает, и часть панели остается затертой). В TImage вся перерисовка выполняется автоматически, за что ей огромное спасибо :).
Вопрос: какое событие нужно перехватывать, чтобы панель перерисовывалась "вовремя"?
Loginov Dmitry (2006-05-19 19:20:00) [7]Сравнил по скорости BitBlt с Canvas.Draw - выигрыш в скорости - нулевой.
Но вот что самое интересное - вывод на экран готового буфера вообще не тратит ресурсов процессора (вывожу на канву панели). А рисование в этом самом буфере - очень даже тратит. Как я понимаю, вывод на экран берет на себя видеокарта, а не процессор.
Gydvin (2006-05-19 16:45:00) [8]
> Сорри, а как пользоваться указанной вами двойной буферизацией?
> Примерчик, или ссылочку (с 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 16:14:00) [9]Desdechado © (19.05.06 11:06) [8]
двойная буферизация - стандартный подход
пока отображается одно, на вторую (невидимую) страницу буфера идет отрисовка новой картинки, а потом BitBlt (он очень быстрый)
и, кстати, буфер можно создать один раз, а потом его юзать
Сорри, а как пользоваться указанной вами двойной буферизацией? Примерчик, или ссылочку (с BitBlt), pleaze!
Loginov Dmitry (2006-05-19 16:03:00) [10]ЮЮ © (19.05.06 10:14) [7]
Счас проверим...
Loginov Dmitry (2006-05-19 16:02:00) [11]Попробовал с буфером - действительно быстрее рисуется (рисую с помощью метода Canvas.Draw()).
Будем знать такие хитрости :))
Gydvin (2006-05-19 12:28:00) [12]
> и, кстати, буфер можно создать один раз, а потом его юзать
Именно, не вижу, чем он не подходит
Desdechado (2006-05-19 11:06:00) [13]> (это вариант меня не устраивает)
двойная буферизация - стандартный подход
пока отображается одно, на вторую (невидимую) страницу буфера идет отрисовка новой картинки, а потом BitBlt (он очень быстрый)
и, кстати, буфер можно создать один раз, а потом его юзать
ЮЮ (2006-05-19 10:14:00) [14]А от второго толков никаких нету - мерцание не устраняется.
<компонен, на котором лежит IMage>.DoubleBuffered:=true;
Gydvin (2006-05-19 10:04:00) [15]приведите фрагмент кода
Loginov Dmitry (2006-05-19 09:45:00) [16]Gydvin © (19.05.06 9:31) [3]
ну тады второй
А от второго толков никаких нету - мерцание не устраняется.
Gydvin (2006-05-19 09:33:00) [17]
> Так что, для того чтобы вывести одну точку на Image, я должен
> использовать дополнительный буфер? Мощно!
тем более в сабже небыло означена что это строчка
Gydvin (2006-05-19 09:31:00) [18]ну тады второй
Loginov Dmitry (2006-05-19 09:29:00) [19]Gydvin © (19.05.06 9:21) [1]
промежуточный буфер tbitmap
Так что, для того чтобы вывести одну точку на Image, я должен использовать дополнительный буфер? Мощно!
(это вариант меня не устраивает)
Gydvin (2006-05-19 09:21:00) [20]промежуточный буфер tbitmap, form1.DoubleBuffered:=true;