Форум: "Начинающим";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];
ВнизМигает картинка Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.056 c