Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.048 c
1-1330933413
Alexs
2012-03-05 11:43
2015.09.10
Access violation


15-1412620344
kriss
2014-10-06 22:32
2015.09.10
FireMonkey


6-1277233821
rooler
2010-06-22 23:10
2015.09.10
Как отправить сообщение через send, но с чужого сокета?


15-1415316941
dmk
2014-11-07 02:35
2015.09.10
Еще немного по ассемблеру


2-1392477234
Сергей
2014-02-15 19:13
2015.09.10
Проблема с созданием меню





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