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

Вниз

Мигает картинка   Найти похожие ветки 

 
alexdn ©   (2014-03-08 02:01) [0]

Тут вроде была уже похожая темка, но всё же. Вот есть такой подход - рисуем в PaintBox событие onPaint. Особенно сильно мигает при прокручивании формы. Вот выложил видео мигания - http://www.youtube.com/watch?v=cEMTao6srzg&feature=youtu.be

procedure TForm4.PaintBox1Paint(Sender: TObject);
var BitMap:TBitMap;
 LenL, LenR: LongInt;
 METRIC_LINE_Y:real;
begin

DrawPicture(PaintBox1.Canvas);  // тут самое главное, рисуется фон (задний план) активного окна

 Display       := TBitmap.Create;
 Display.Width := PaintBox1.Width;
 Display.Height:= PaintBox1.Height;
 Display.Transparent:= True;

 // Чистим канву.
 Display.Canvas.Brush.Color:= clWhite;
 Display.Canvas.FillRect(Display.Canvas.ClipRect);

 // Рисуем окно.
 Display.Canvas.Pen.Width:= 2;
 Display.Canvas.Pen.Color:= clBlack;
 Display.Canvas.Brush.Color:= clRed;
 Display.Canvas.Rectangle(GetRectWindow);

 Display.Canvas.Pen.Width:= 2;
 Display.Canvas.Pen.Color:= clBlack;

 // Выводим.
 PaintBox1.Canvas.Draw(0, 0, Display);
 Display.Free;


 
Ega23 ©   (2014-03-08 12:07) [1]

DoubleBuffered := True;


 
alexdn ©   (2014-03-08 13:39) [2]

Нет, это стандартный подход, но он не помогает. Говорят хорошо рисовать на канве формы, попробую всё перекинуть в onPaint формы.


 
alexdn ©   (2014-03-08 17:46) [3]

Что то всё равно не выходит ничего..


 
Rouse_ ©   (2014-03-08 17:56) [4]


> alexdn ©

Пардон, у тебя там даж не мигание, а вообще не понятно что.
Такое ощущение что идут "тяжелые" рассчеты прямо в GUI потоке, причем непосредственно в момент отработки WM_PAINT.
Сделай простую демку, показывающую такое поведение и выложи на паблик - так будет проще...


 
alexdn ©   (2014-03-08 18:16) [5]

Я решил эту проблему!!!) Вся загвоздка была в том, что там был в таймере PaintBox1.Invalidate; Я выбросил таймер вообще и вставил PaintBox1.Invalidate; в конец PaintBox1 onPaint. Теперь всё Ok)..


 
alexdn ©   (2014-03-08 18:21) [6]

Rouse_ был ближе всех к истине.


 
Rouse_ ©   (2014-03-08 18:30) [7]


> Я выбросил таймер вообще и вставил PaintBox1.Invalidate;
>  в конец PaintBox1 onPaint. Теперь всё Ok)..

Как эта?
Т.е. ты только что отрисовал и сразу говоришь что все нарисованное не валидно?!!!!
Просадки по CPU на отрисовке не наблюдаешь в том-же Task Manager?


 
alexdn ©   (2014-03-08 18:46) [8]

С доубле буфферед CPU показывает 40-50, убрал доубле стало 35. Причём как то стабильно независимо не от чего.. Да, может и не совсем логично, но пока работает как зверь, ничего плохого я сказать не могу.


 
Rouse_ ©   (2014-03-08 18:53) [9]

Т.е. по твоему 35 процентов просадки, это нормально? :)))


 
alexdn ©   (2014-03-09 00:29) [10]

Ну похоже ничего другого уже не будет).. как то других идей больше нет.


 
Rouse_ ©   (2014-03-09 01:30) [11]

Invalidate убери


 
alexdn ©   (2014-03-09 02:05) [12]

Нет, без Invalidate не работает.


 
Inovet ©   (2014-03-09 02:24) [13]

> [12] alexdn ©   (09.03.14 02:05)
> Нет, без Invalidate не работает.

Методом тыка напрагромил? Чёт я не пойму, почему это вообще работает. А, так 35% поди на 4 ядерном? Ну всё правильно, зря штоле ядра покупал, пусть отрабатываю теперь. Скоро 100500 ядерные выпустят, так совсем незаметно будет.


 
alexdn ©   (2014-03-09 19:10) [14]

Нет, 35 на двухядерном..


 
alexdn ©   (2014-03-09 19:18) [15]

Тут скорее всего проблемы с методологией вообще. Вот почему мигает? Вроде ничего сложного - ну процедура DrawPicture(PaintBox1.Canvas) отрисовывает фон, потом на этот фон накладывается активное окно PaintBox1.Canvas.Draw(0, 0, Display). Всего два шага, а уже мигает. Потом каким то волшебным способом PaintBox1.Invalidate это всё замораживает, мигание уходит. Вот и вся трёхходовка.


 
Sapersky   (2014-03-09 20:07) [16]

Зачем два шага, если можно выводить на экран за один - DrawPicture(Display.Canvas) и потом PaintBox1.Canvas.Draw(0, 0, Display).
Вообще Display лучше создать заранее, убрать из OnPaint всё кроме Draw(0, 0, Display), а сам Display перерисовывать по необходимости, только если действительно что-то изменилось.

Ещё добавь к форме, на которой рисуешь:

procedure TForm1.WMEraseBkgnd(var Message: TWmEraseBkgnd);
begin
Message.Result := 1;
end;

Убирает мерцание при изменении размеров.



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

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

Наверх




Память: 0.5 MB
Время: 0.036 c
15-1415447176
dmk
2014-11-08 14:46
2015.09.10
Про переменные


6-1266921336
nikih22
2010-02-23 13:35
2015.09.10
serversoket and pppoe


15-1418713981
Pavia
2014-12-16 10:13
2015.09.10
Регулярные выражения


4-1272625269
Fred
2010-04-30 15:01
2015.09.10
Имя ярлыка


15-1412932789
Kerk
2014-10-10 13:19
2015.09.10
Подсветка