Главная страница
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.075 c
11-1259759327
MTsv DN
2009-12-02 16:08
2015.09.10
Разыскивается код...


15-1414618202
Юрий
2014-10-30 01:30
2015.09.10
С днем рождения ! 30 октября 2014 четверг


15-1421111607
Кто б сомневался
2015-01-13 04:13
2015.09.10
Какие программы используете для построения блок схем?


15-1413142327
xayam
2014-10-12 23:32
2015.09.10
Задача


15-1356233809
Inovet
2012-12-23 07:36
2015.09.10
(3) О чём-то ещё