Тормоза с перерисовкой контролов после апгрейда до 1.4

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Тормоза с перерисовкой контролов после апгрейда до 1.4

Сообщение PVOzerski » 19.05.2015 17:35:34

ОК. выкладываю исходники + файл с параметрами модели (success2 без расширения). Параметры надо будет загрузить из проги через кнопку "Load All" (в верхней части формы). Тормоза будут видны уже в процессе загрузки параметров. Еще более сильные тормоза будут с, как его здесь назвали, "эквалайзером" :) по нажатии кнопки "Start".

Сейчас в исходниках, в файле m1d_u1.pas, у меня добавлена в самом верху директива компиляции {$define NOREFRESH} (и пара соответствующих {$IFNDEF} в коде ниже). В таком состоянии "тормозов" не будет. Если строчку {$define NOREFRESH} "отрубить", "тормоза" появятся во всей красе. Напоминаю: проблема актуальна для GTK2 на платформах linux (32- 64-разрядной), насчет актуальности для винды и прочих систем ничего сказать не могу.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Re: Тормоза с перерисовкой контролов после апгрейда до 1.4

Сообщение Vadim » 19.05.2015 18:37:24

Скомпилил. Нажал кнопку "Load All". Загрузилось всё менее чем за секунду. Нажал кнопку "Start". Эквалайзер судорожно задёргался. Все движки уползли вниз, Остался только 14-ый слева, он продолжил судорожно дёргаться вверх-вниз, но с какой частотой - не скажу, глаз не может уследить.
Чем ишшо проверить это сооружение? ;-)

Добавлено спустя 12 минут 39 секунд:
Вот ссылка на видео:
https://yadi.sk/i/IaxZGGWegjedo

Добавлено спустя 24 минуты 23 секунды:
Только заметил, что Вы там NOREFRESH уже поставили. :-)
Вот чисто по мне, так с тормозами куда как красивее, чем без них. Как-то выглядит всё благороднее, солиднее. ;-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Тормоза с перерисовкой контролов после апгрейда до 1.4

Сообщение PVOzerski » 19.05.2015 19:35:02

Увы, это не тот случай, когда солидность и благородность ценится :(
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Re: Тормоза с перерисовкой контролов после апгрейда до 1.4

Сообщение Vadim » 19.05.2015 19:38:24

Исключительно в качестве гипотизы. Если вместо TSpeedButton использовать какой-либо более интеллектуальный компонент, который ведёт свою героическую родословнуюю от TWinControl, то можно будет использовать свойство DoubleBuffered.

Добавлено спустя 1 минуту 49 секунд:
Вопрос, а методом Refresh Вы чего именно добиваетесь?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Тормоза с перерисовкой контролов после апгрейда до 1.4

Сообщение PVOzerski » 19.05.2015 19:41:58

Дык два отрубленных Refresh применительно к данной проге и так проблему решают. Главная-то идея поста - проверить, нет ли бага в LCL (т.е. есть ли возникающим тормозам, которых не было в предыдущей версии Лазаря, какое-то рациональное оправдание).
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Re: Тормоза с перерисовкой контролов после апгрейда до 1.4

Сообщение Vadim » 19.05.2015 20:35:26

PVOzerski
И всё-таки, зачем Вы вручную вызываете Refresh?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Тормоза с перерисовкой контролов после апгрейда до 1.4

Сообщение PVOzerski » 19.05.2015 20:39:30

Теперь уже не отвечу точно - видимо, когда-то что-то не так прорисовывалось. Прога-то эта написана, как минимум, пару лет назад.
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Re: Тормоза с перерисовкой контролов после апгрейда до 1.4

Сообщение Vadim » 19.05.2015 21:40:12

Дело в том, что и без всякого Refresh контролы у Вас двигаются прекрасно. Refresh вызывает Repaint, а Repaint перерисовывает контрол. Однако и без этого контрол перерисовывается как только Вы ему присваиваете другие координаты. Получается двойная перерисовка компонента.
Смысл мучить несчастного Лазаря мартышкиным трудом, а потом ещё и упрёки ему предъявлять? ;-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Тормоза с перерисовкой контролов после апгрейда до 1.4

Сообщение pupsik » 20.05.2015 01:34:15

А мне куда интереснее вопрос:
Что такое синхронизация. И как с ней работать??? :roll:

п.с.
Мне, вот кажется, для взаимодействиями с визуальными котролами из потока её пользуют. Вот только чет я этого не заметил. Может плохо смотрел? Или она не нужна?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Тормоза с перерисовкой контролов после апгрейда до 1.4

Сообщение PVOzerski » 20.05.2015 09:28:47

Плохо смотрели :)
Вот здесь:
procedure TWorkThread.Execute;
begin
stopping := False;
Counter := 0;
repeat
NextGeneration;
Synchronize(@DoIndicator);
until stopping;
Synchronize(@Answer);
end;

А DoIndicator, в свою очередь, вызывает, в частности, Form1.ChangeMarkerPos - это перерисовка "эквалайзера".
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Re: Тормоза с перерисовкой контролов после апгрейда до 1.4

Сообщение pupsik » 20.05.2015 14:39:16

Плохо то плохо. Но неужели поток необходим лишь для того что бы "рисовать" форму? Хотя, возможно, и не важно это :)
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Тормоза с перерисовкой контролов после апгрейда до 1.4

Сообщение PVOzerski » 20.05.2015 14:50:39

В данном случае - примерно так, для отрисовки и, еще в большей мере, для возможности остановить цикл вручную через стандартный интерфейс. Конечно, теоретически можно было бы воткнуть в главный цикл Application.ProcessMessages и обойтись одним потоком, но этот способ очень сильно подтормаживает цикл безо всяких Refresh ;). А писать свои обработчики событий клавы и мыши - увольте :)

Но вообще, по мне, это уже оффтоп пошел. Обсуждать, правильно или неправильно написана эта программа, конечно, не запретишь, но пост-то я делал ровно потому, что она продемонстрировала, что в LCL версии 1.4 метод Refresh стал существенно более медленным и хорошо бы разобраться, фича это или-таки баг LCL (а не моей проги, которая свою основную задачу выполняет, невзирая на то, насколько некрасиво или красиво она написана). Как-то так...
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Re: Тормоза с перерисовкой контролов после апгрейда до 1.4

Сообщение zub » 20.05.2015 15:09:11

PVOzerski
Багом LCL это станет тогда когда кнопка перестанет выполнять свои функции. Пока абсолютно точно это не баг.

>>метод Refresh стал существенно более медленным и хорошо бы разобраться
Не знаю, насколько критична скорость Refresh - по мне абсолютно не критична. возможно там возникают по вашей или по вине лцл паразитные "отрисовки" - но это следствие нецелевого использования

Чтоб разобраться необходимо найти момент (комит) после которого появились "тормоза"
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Тормоза с перерисовкой контролов после апгрейда до 1.4

Сообщение pupsik » 20.05.2015 15:12:31

Хм лазарь 1.5, фпс 3.3.1, ну..у и жтк2 = 0 лагов. Т.е. ваш пример не лагает по отрисове. Скачет себе.
А вот по поводу потока и контролов уж больно все как то не так (т.е. реализовано, но это сугубо мое мнение). Сори что отвлек :D
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Тормоза с перерисовкой контролов после апгрейда до 1.4

Сообщение PVOzerski » 20.05.2015 15:20:20

Поставил опыт. С Refresh и без Refresh у меня "побегали" TLabel и TStaticText. Без Refresh у меня процесс перемещения контролов вообще не виден. C Refresh "на глазок" контрол типа TLabel при равных условиях в несколько раз уступает в "скорости пробега" контролу типа TStaticText. Намекаю: TLabel, как и TSpeedButton, - наследник TGraphicControl, а TStaticText - наследник TWinControl. Можно предположить, что тормозит метод TGraphicControl.Refresh.
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 242

Рейтинг@Mail.ru