Текущий архив: 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