Тормоза с перерисовкой контролов после апгрейда до 1.4
Модератор: Модераторы
-
PVOzerski
- постоялец
- Сообщения: 109
- Зарегистрирован: 19.05.2005 13:45:10
- Откуда: СПб
- Контактная информация:
Тормоза с перерисовкой контролов после апгрейда до 1.4
Столкнулся с неприятной проблемой. Была прога (имитационная модель с многопоточностью и графическим выводом), сделанная на Lazarus 1.2.6. Собиралась под GTK2 для Linux , успешно работала. Однако после пересборки в Lazarus 1.4 при использовании тех же параметров начались лютые тормоза с отрисовкой контролов и линий и выводом текста в текстовые поля. от разрядности сборки проблема не зависит. Интересно, что если в качестве графической библиотеки использовать qt, то проблема исчезает (однако это неудобное решение, так как в этом случае прога тянет за собой дополнительные библиотеки).
Если кто-нибудь захочет поискать истоки бага и пути его решения, готов предоставить исходники проги и дать любые пояснения.
Если кто-нибудь захочет поискать истоки бага и пути его решения, готов предоставить исходники проги и дать любые пояснения.
-
alex208210
- постоялец
- Сообщения: 207
- Зарегистрирован: 12.05.2010 13:16:51
просто дай пример кода прорисовки который сейчас не работает, те кто что то знает напишут сами.
-
PVOzerski
- постоялец
- Сообщения: 109
- Зарегистрирован: 19.05.2005 13:45:10
- Откуда: СПб
- Контактная информация:
Кажется, кое-что я раскопал... Похоже, тормозит метод Refresh у TSpeedButton (возможно, и у других контролов тоже). Демонстрационный код очень простой. Нужно взять форму побольше, положить на нее где-нибудь чуть ниже заголовка кнопку (TButton) Button1, еще ниже - быструю кнопку (TSpeedButton) SpeedButton1.
На Onclick для кнопки Button1 назначаем такой вот обработчик:
Потом на глаз сравниваем, с какой скоростью SpeedButton бежит по форме при тулкитах qt и GTK2 (показательно также будет "закомментировать" SpeedButton1.Refresh при использовании GTK2 - разница тоже очень ощутимая). Еще раз напоминаю, что всё проверялось только в Linux (а конкретно этот образец - только в 64-разрядной системе).
На Onclick для кнопки Button1 назначаем такой вот обработчик:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
for i := 1 to 300 do
begin
SpeedButton1.Left := SpeedButton1.Left + 1;
SpeedButton1.Refresh;
end;
end;Потом на глаз сравниваем, с какой скоростью SpeedButton бежит по форме при тулкитах qt и GTK2 (показательно также будет "закомментировать" SpeedButton1.Refresh при использовании GTK2 - разница тоже очень ощутимая). Еще раз напоминаю, что всё проверялось только в Linux (а конкретно этот образец - только в 64-разрядной системе).
А зачем вам нужны бегающие кнопки? с таким подходом ни на какую скорость расчитывать не приходится - не должны кнопки бегать, да и заставлять их перерисовываться ручками тоже не стоит. Дайте скрин тормозящей картинки, подозреваю перенасыщенность контролами и вызов ченить аля Refresh этих контролов пачками и в неподходящих местах((
zub писал(а):А зачем вам нужны бегающие кнопки?
Человек пишет вирус. При наведении мышки на кнопку, кнопка начинает метаться по форме во все стороны.
-
PVOzerski
- постоялец
- Сообщения: 109
- Зарегистрирован: 19.05.2005 13:45:10
- Откуда: СПб
- Контактная информация:
"Человек" не пишет вирус, а написал программу, реализующую имитационную модель и до перекомпиляции, несмотря на избыточные контролы, вполне нормально работавшую. Так что одно из двух: либо раньше метод Refresh в LCL был "заглушкой", а теперь стал делать что-то нужное, но медленно, либо налицо регрессия - независимо от того, нравится кому-то или нет стиль программирования "человека". Если интересно, зачем двигать speedbutton'ы - могу объяснить: примерно затем же, зачем это делается в IDE Лазаря, - чтобы вручную позиционировать их там, где надо (а потом, в ходе работы модели, они будут перемещаться уже сами). Да, вероятно, всё это можно было написать через чистую графику, без привлечения контролов, но так было проще. Поскольку работало - меня устраивало. Стало работать отвратно - поднял вопрос. Вот и всё.
>>Поскольку работало - меня устраивало. Стало работать отвратно - поднял вопрос. Вот и всё.
То что это работало гдето не значит что будет работать везде и тем более незначит что должно работать. Имхо подход неверный, надо было
>>Да, вероятно, всё это можно было написать через чистую графику, без привлечения контролов, но так было проще.
По мне так какраз проще нарисовать чем иметь кучу контролов
То что это работало гдето не значит что будет работать везде и тем более незначит что должно работать. Имхо подход неверный, надо было
>>Да, вероятно, всё это можно было написать через чистую графику, без привлечения контролов, но так было проще.
По мне так какраз проще нарисовать чем иметь кучу контролов
PVOzerski
А без Refresh никак нельзя обойтись?
Просто я хочу промоделировать Вашу ситуацию, но не знаю всех сопутствующих обстоятельств.
Lazarus 1.5, SpeedButton бегает по форме как угорелая, что с Refresh, что без. Правда она одна, я не знаю, при каком количестве контролов начинается кризис.
Добавлено спустя 5 минут 33 секунды:
Как раз с подобными контролами получается проще, чем с обычным рисованием. Я лет 10 назад тоже делал программку, которая моделирует некую структурную схему, правда вместо TSpeedButton использовал TShape, т.к. по техзадению у меня было всего 4 предопределённых условных элемента. И вот эти контролы во всю имитировали работу, тоже бегая по форме и на ходу перестраивая свои связи.
А без Refresh никак нельзя обойтись?
Просто я хочу промоделировать Вашу ситуацию, но не знаю всех сопутствующих обстоятельств.
Добавлено спустя 5 минут 33 секунды:
zub писал(а):По мне так какраз проще нарисовать чем иметь кучу контролов
Как раз с подобными контролами получается проще, чем с обычным рисованием. Я лет 10 назад тоже делал программку, которая моделирует некую структурную схему, правда вместо TSpeedButton использовал TShape, т.к. по техзадению у меня было всего 4 предопределённых условных элемента. И вот эти контролы во всю имитировали работу, тоже бегая по форме и на ходу перестраивая свои связи.
>>Как раз с подобными контролами получается проще, чем с обычным рисованием.
Возможно, с одним виджесетом, с не "перегруженой" схемой, с четким т.з., с гарантией того что в дальнейшем не будет кардинальных изменений... и т.д. и т.п.
PVOzerski
скрин будет?
Возможно, с одним виджесетом, с не "перегруженой" схемой, с четким т.з., с гарантией того что в дальнейшем не будет кардинальных изменений... и т.д. и т.п.
PVOzerski
скрин будет?
-
PVOzerski
- постоялец
- Сообщения: 109
- Зарегистрирован: 19.05.2005 13:45:10
- Откуда: СПб
- Контактная информация:
Да пожалуйста. Могу и исходники выслать с инструкцией. Тем более что я-то workaround нашел - два refresh'а (по факту, лишних) отрубил - и всё нормализовалось. Скорее это потенциальный багрепорт для LCL (если только они не прибавили взамен скорости какой-то нужный функционал), чем проблема моей проги. А с багами всё-таки нужно разбираться.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
>>Да пожалуйста. Могу и исходники выслать с инструкцией
Высылать ненадо, надо выкладывать на общедоступный хостинг контроля версий, т.е. открывать))
Имхо тормозить тут нечему. явно гдето чтото у вас нетак (или какаянить особенность гтк, наврятли баг) и происходит множественная отрисовка всего и вся.
Кнопки узлы графиков и бегунки "эквалайзера" снизу?
Еще более убеждаюсь что нарисовать всё руками будет практичней, включая кучу безликих едитов - делая полноценным контролом находу только тот который поллучает фокус
Высылать ненадо, надо выкладывать на общедоступный хостинг контроля версий, т.е. открывать))
Имхо тормозить тут нечему. явно гдето чтото у вас нетак (или какаянить особенность гтк, наврятли баг) и происходит множественная отрисовка всего и вся.
Кнопки узлы графиков и бегунки "эквалайзера" снизу?
Еще более убеждаюсь что нарисовать всё руками будет практичней, включая кучу безликих едитов - делая полноценным контролом находу только тот который поллучает фокус
-
PVOzerski
- постоялец
- Сообщения: 109
- Зарегистрирован: 19.05.2005 13:45:10
- Откуда: СПб
- Контактная информация:
Насчет "вины" GTK2 - тогда бы проблема возникла сразу, а не после смены версии Lazarus.
Ну, а контролы Вы распознали сразу
Ну, а контролы Вы распознали сразу
Последний раз редактировалось PVOzerski 19.05.2015 14:50:08, всего редактировалось 1 раз.
Что то очень похожее - эквалайзер, графики я видел среди контроллов в базовом пакете CodeTyphon.
PVOzerski, соглашусь с zub частично. Переползая с Delphi инспектор свойств самописный у меня начал тупить, переписал все на самостоятельную отрисовку на канве и оставил пару контроллов, которые появлялись только для редактирования. Все стало по человечески работать и не тупить.
PVOzerski, соглашусь с zub частично. Переползая с Delphi инспектор свойств самописный у меня начал тупить, переписал все на самостоятельную отрисовку на канве и оставил пару контроллов, которые появлялись только для редактирования. Все стало по человечески работать и не тупить.
PVOzerski
Выложите сюда исходники (только исходники) и напишите подробнее, какие именно Ваши действия приводят к тормозам.
Выложите сюда исходники (только исходники) и напишите подробнее, какие именно Ваши действия приводят к тормозам.
>>Насчет "вины" GTK2 - тогда бы проблема возникла сразу, а не после смены версии Lazarus.
Не факт. Глянте сколько было изменений в гтк бакенде с 1.2 до 1.4 (недумаю что их было много, вообще поставте транк и найдите конкредный "сбойный" комит) - чтонить добавили или переделали более правильно.
Не факт. Глянте сколько было изменений в гтк бакенде с 1.2 до 1.4 (недумаю что их было много, вообще поставте транк и найдите конкредный "сбойный" комит) - чтонить добавили или переделали более правильно.
