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

Вниз

Как убрать мелькания при прорисовке изображений   Найти похожие ветки 

 
Nox7777   (2005-08-08 23:58) [0]

У меня в таймере идет такой код, который рисует некоторую фигуру, но на экране фигура постоянно мелькает. Как это убрать?

Код:
begin
 Plan.Canvas.Pen.Color:=clBlack;
 Plan.Canvas.Rectangle(0,0,560,360);
 Plan.Canvas.Pen.Color:=clBlue;
 Plan.Canvas.Ellipse(Map[1,0]-2,Map[1,1]-2,Map[1,0]+2,Map[1,1]+2);
 Plan.Canvas.Ellipse(Map[1,0]-1,Map[1,1]-1,Map[1,0]+1,Map[1,1]+1);
 for i:=2 to kolpoint do
 begin
   Plan.Canvas.Pen.Color:=clGreen;
   Plan.Canvas.MoveTo(Map[i-1,0],Map[i-1,1]);
   Plan.Canvas.LineTo(Map[i,0],Map[i,1]);
   Plan.Canvas.Pen.Color:=clBlue;
   Plan.Canvas.Ellipse(Map[i,0]-2,Map[i,1]-2,Map[i,0]+2,Map[i,1]+2);
   Plan.Canvas.Ellipse(Map[i,0]-1,Map[i,1]-1,Map[i,0]+1,Map[i,1]+1);
 end;


 
Marser ©   (2005-08-09 00:21) [1]

Ввводим двойную буферизацию. Производительность, конечно, упадёт, но мелькать не будет:
Plan.DoubleBuffered:=true


 
Nox777   (2005-08-09 00:33) [2]

А куда вводим... Я после бегина поставил... но не работает...
undeclared identifier DoubleBuffered


 
alex-drob ©   (2005-08-09 00:36) [3]

procedure TForm1.FormCreate(Sender: TObject);
begin
DoubleBuffered:=True;
end;


 
Nox777   (2005-08-09 00:38) [4]

Вот, теперь все работает... Спасибо!


 
KilkennyCat ©   (2005-08-09 00:44) [5]

Создаем дополнительный битмап-буфер:

Var
 BMP : TBitMap;
...
TForm1.onCreate...
begin
...
 BMP := TBitMap.Create;
 BMP.Width := Plan.Width;
 BMP.Height := Plan.Height:
...
end;

не забудем сразу же и о его убиении:

TForm1.onClose...
begin
...
BMP.Free;
...
end;

Теперь используем его:

begin
 With BMP.Canvas do begin //это чтобы много раз не писать BMP.Canvas
    Pen.Color:=clBlack;
    Rectangle(0,0,560,360);
    Pen.Color:=clBlue;
    Ellipse(Map[1,0]-2,Map[1,1]-2,Map[1,0]+2,Map[1,1]+2);
    Ellipse(Map[1,0]-1,Map[1,1]-1,Map[1,0]+1,Map[1,1]+1);
      for i:=2 to kolpoint do begin
         Pen.Color:=clGreen;
         MoveTo(Map[i-1,0],Map[i-1,1]);
         LineTo(Map[i,0],Map[i,1]);
         Pen.Color:=clBlue;
         Ellipse(Map[i,0]-2,Map[i,1]-2,Map[i,0]+2,Map[i,1]+2);
         Ellipse(Map[i,0]-1,Map[i,1]-1,Map[i,0]+1,Map[i,1]+1);
      end;
 end;
//далее используем суперскоростное отображение нашего буферного битмапа на Plan, используя функцию WinAPI:
BitBlt(Plan.Canvas.Handle,0,0,Plan.Width,Plan.Height,BMP.Canvas.Handle,0,0,0);
End;


Можно таким же образом создать еще и очищающий буферный битмап, который будет просто накладываться на буфер для рисования той же функцией BitBlt c целью очистки.
Подобные решения работают в DirectX.


 
Marser ©   (2005-08-09 00:47) [6]

Nox777   (09.08.05 0:33) [2]
Я стал гадать, что такое Plan. И не угадал.


 
KilkennyCat ©   (2005-08-09 00:48) [7]

P.S.
Мне кажется, это лучше чем встроенный даблбуффер, так как в данном случае Вы будете являться хозяином положения и менять все очень гибко, например, все вычисления и рисования примитивов выполнять в одном потоке, а перенос с буфера на основную поверхность - в другом, когда это потребуется.


 
ApollonX100 ©   (2005-08-09 11:00) [8]

Я теперь больше не Nox777, я теперь апаллон...
Спасибо KilkennyCat, попробую ваш метод.

Plan-от слова планшет...



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

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

Наверх




Память: 0.46 MB
Время: 0.013 c
14-1124259913
geidarka
2005-08-17 10:25
2005.09.11
UTF-8 редакторы


14-1124281539
oldman
2005-08-17 16:25
2005.09.11
Вчера умер Гомельский.


1-1124796950
Jolik
2005-08-23 15:35
2005.09.11
exception в finally


1-1124174297
Death_R
2005-08-16 10:38
2005.09.11
Декомпиляция


1-1124792531
TikTanik
2005-08-23 14:22
2005.09.11
Обьединение классов! :)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский