![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Мигает картинка
alexdn © (2014-03-08 02:01:00)Тут вроде была уже похожая темка, но всё же. Вот есть такой подход - рисуем в 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;
Sapersky (2014-03-09 20:07:00) [1]Зачем два шага, если можно выводить на экран за один - 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;
Убирает мерцание при изменении размеров.
alexdn (2014-03-09 19:18:00) [2]Тут скорее всего проблемы с методологией вообще. Вот почему мигает? Вроде ничего сложного - ну процедура DrawPicture(PaintBox1.Canvas) отрисовывает фон, потом на этот фон накладывается активное окно PaintBox1.Canvas.Draw(0, 0, Display). Всего два шага, а уже мигает. Потом каким то волшебным способом PaintBox1.Invalidate это всё замораживает, мигание уходит. Вот и вся трёхходовка.
alexdn (2014-03-09 19:10:00) [3]Нет, 35 на двухядерном..
Inovet (2014-03-09 02:24:00) [4]> [12] alexdn © (09.03.14 02:05)
> Нет, без Invalidate не работает.
Методом тыка напрагромил? Чёт я не пойму, почему это вообще работает. А, так 35% поди на 4 ядерном? Ну всё правильно, зря штоле ядра покупал, пусть отрабатываю теперь. Скоро 100500 ядерные выпустят, так совсем незаметно будет.
alexdn (2014-03-09 02:05:00) [5]Нет, без Invalidate не работает.
Rouse_ (2014-03-09 01:30:00) [6]Invalidate убери
alexdn (2014-03-09 00:29:00) [7]Ну похоже ничего другого уже не будет).. как то других идей больше нет.
Rouse_ (2014-03-08 18:53:00) [8]Т.е. по твоему 35 процентов просадки, это нормально? :)))
alexdn (2014-03-08 18:46:00) [9]С доубле буфферед CPU показывает 40-50, убрал доубле стало 35. Причём как то стабильно независимо не от чего.. Да, может и не совсем логично, но пока работает как зверь, ничего плохого я сказать не могу.
Rouse_ (2014-03-08 18:30:00) [10]
> Я выбросил таймер вообще и вставил PaintBox1.Invalidate;
> в конец PaintBox1 onPaint. Теперь всё Ok)..
Как эта?
Т.е. ты только что отрисовал и сразу говоришь что все нарисованное не валидно?!!!!
Просадки по CPU на отрисовке не наблюдаешь в том-же Task Manager?
alexdn (2014-03-08 18:21:00) [11]Rouse_ был ближе всех к истине.
alexdn (2014-03-08 18:16:00) [12]Я решил эту проблему!!!) Вся загвоздка была в том, что там был в таймере PaintBox1.Invalidate; Я выбросил таймер вообще и вставил PaintBox1.Invalidate; в конец PaintBox1 onPaint. Теперь всё Ok)..
Rouse_ (2014-03-08 17:56:00) [13]
> alexdn ©
Пардон, у тебя там даж не мигание, а вообще не понятно что.
Такое ощущение что идут "тяжелые" рассчеты прямо в GUI потоке, причем непосредственно в момент отработки WM_PAINT.
Сделай простую демку, показывающую такое поведение и выложи на паблик - так будет проще...
alexdn (2014-03-08 17:46:00) [14]Что то всё равно не выходит ничего..
alexdn (2014-03-08 13:39:00) [15]Нет, это стандартный подход, но он не помогает. Говорят хорошо рисовать на канве формы, попробую всё перекинуть в onPaint формы.
Ega23 (2014-03-08 12:07:00) [16]DoubleBuffered := True;