Russian Qt Forum
Ноябрь 22, 2024, 15:14
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Программирование
>
Общий
>
Оптимизация плагинов
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Оптимизация плагинов (Прочитано 8053 раз)
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Оптимизация плагинов
«
:
Октябрь 13, 2016, 10:29 »
Добрый день
Да, понимаю что лезть в чужой (и страшно большой) код опасно, но вот "надо".
Есть объект на который можно прицепить любое число плагинов которые организованы по группам. Примерная схема
Цитировать
Объект (все плагины работают с его геометрией)
- Группа плагинов 1
- плагин 1_1
- плагин 1_2
...
- Группа плагинов 2
- плагин 2_1
- плагин 2_2
...
Как плагины так и группы имеют параметры и запрашивают их у хоста (ну то есть у меня). Как плагины так и группы могут быть вкл/выкл юзером и их порядок применения может быть изменен. Параметры есть значения на линейке времени, по-нашему "анимейшн курва".
И вот требуется, казалось бы, очень простая вещь - если во времени ничего не меняется, то и плагины не дергать попусту. Сейчас тупо считает каждом фрейме, конечно жуткие тормоза.
Что бы Вы предложили? Какой метод? Ну может пресловутые "паттерны" помогут?
Спасибо
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Оптимизация плагинов
«
Ответ #1 :
Октябрь 13, 2016, 12:49 »
Можно смотреть на каждом фрейме, есть ли на таймлайне изменения касательно вкл-выкл плагина и изменения параметров. Если нет - применять предыдущие (т.е. актуальные) рассчитанные данные.
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Оптимизация плагинов
«
Ответ #2 :
Октябрь 13, 2016, 13:13 »
Цитата: Racheengel от Октябрь 13, 2016, 12:49
Можно смотреть на каждом фрейме, есть ли на таймлайне изменения касательно вкл-выкл плагина и изменения параметров. Если нет - применять предыдущие (т.е. актуальные) рассчитанные данные.
Ну вот, в очередной раз моя тема сваливается в диалог с Вами
Вообще, впечатление что проблемы только у меня, у остальных их просто нет (ну может что-то там не ладится с портами).
Сделать "слепок" и потом его сравнивать конечно напрашивается, но тут возникают неприятные моменты
1) Где этот "слепок" хранить? И как? (в смысле что туда писать). Напр указатель на плагин или группу плагинов- но его юзер может грохнуть. Что тогда? Сидеть с невалидным указателем - ну как минимум получу ABA. А отслеживать всю активность юзера - не знаю возможно или нет, но как минимум очень накладно
2) Эта операция не первая и не последняя в pipeline, которая работает так: есть объект, есть его исходная.базовая геометрия. Она копируется (один раз) и подается на вход операции которая изменяет геометрию и передает ее на вход следующей операции и.т.д. Хранится только оригинал и "что в конце-концов получилось". Поэтому если хоть что-то в pipline изменено - все по новой с нуля, это нормально. И тут "слепок" надо как-то прибивать, хз как
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Оптимизация плагинов
«
Ответ #3 :
Октябрь 13, 2016, 14:01 »
1. Ну как минимум плагины не по "указателю" тогда хранить, а по Id. Менеджер плагинов должен знать, какой плагин жив, а какой уже отошел.
2. А разве параметры не хранятся на таймлайне? Ну т.е. я бы предположил, что параметры разделены по плагинам, и привязка однозначна. Например, в момент Т1 был активирован плагин Р1 с одними параметрами, а в момент Т2 - плагин Р2, но при этом Т1 еще не был деактивирован. Но тогда на таймлайне в Т2 будет только команда активации Р2 и его параметры. Т1 как был активен, так и остается.
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Оптимизация плагинов
«
Ответ #4 :
Октябрь 13, 2016, 17:28 »
Цитата: Racheengel от Октябрь 13, 2016, 14:01
1. Ну как минимум плагины не по "указателю" тогда хранить, а по Id. Менеджер плагинов должен знать, какой плагин жив, а какой уже отошел.
Это щас мы такие умные по Id хранить. А код писался в ранние 90-е (typedef struct и все такое)
Цитата: Racheengel от Октябрь 13, 2016, 14:01
2. А разве параметры не хранятся на таймлайне? Ну т.е. я бы предположил, что параметры разделены по плагинам, и привязка однозначна.
Совершенно однозначна, что создает иллюзию легкого решения (ну вот же, рукой подать)
Цитата: Racheengel от Октябрь 13, 2016, 14:01
Например, в момент Т1 был активирован плагин Р1 с одними параметрами, а в момент Т2 - плагин Р2, но при этом Т1 еще не был деактивирован. Но тогда на таймлайне в Т2 будет только команда активации Р2 и его параметры. Т1 как был активен, так и остается.
Не понял. (де)Активация - это просто флажки, они хранятся но на линейке времени их нет
Похоже "только с этой операцией" не удастся - надо завязываться на весь pipeline. А там страшнЭ
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Оптимизация плагинов
«
Ответ #5 :
Октябрь 14, 2016, 13:55 »
Цитировать
(де)Активация - это просто флажки, они хранятся но на линейке времени их нет
Т.е. в смысле, заранее известно какие плагины отключены, а какие нет?
Тогда еще проще, все отключенные мы игнорируем.
Применяем только параметры для активных.
Записан
What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.
COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Оптимизация плагинов
«
Ответ #6 :
Октябрь 14, 2016, 16:10 »
Цитата: Racheengel от Октябрь 14, 2016, 13:55
Т.е. в смысле, заранее известно какие плагины отключены, а какие нет?
Да
Тут полазил в коде. Хреново. Во-первых многие плагины имеют неанимированные параметры (те же флажки) которых на линейке времени нет. Ну ладно, это еще как-то решаемо, напр "закрыли окно UI плагина - общий сброс", один лишний пересчет - мелочь. Но раскопал 2-3 плагина, эти уроды могут ссылаться/используют вообще др (внешние) объекты, а те могут меняться во времени как угодно.
Цитировать
А это ппц - подумал Штирлиц
Записан
ssoft
Программист
Offline
Сообщений: 584
Re: Оптимизация плагинов
«
Ответ #7 :
Октябрь 15, 2016, 07:10 »
Не знаю, возможно ли это в данной ситуации, все зависит от корректности реализации плагинов.
Я когда-то использовал такую схему, если флажок есть, то плагины подгружаются и регистрируются (диспетчером), создаются объекты со всем необходимыми ассоциациями (например, диспетчер хранит соотношение объектов и плагина). Если флажок снимается, то необходимо полностью вернуть систему в исходное состояние (диспетчер удаляет объекты, поправляет параметры) и полностью выгрузить плагин. Однако данная схема не работает, если нет механизма чистки за собой ресурсов, параметров и др.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Оптимизация плагинов
«
Ответ #8 :
Октябрь 15, 2016, 08:41 »
Цитата: ssoft от Октябрь 15, 2016, 07:10
Не знаю, возможно ли это в данной ситуации, все зависит от корректности реализации плагинов.
..
Плагины написаны в незапамятные времена, работают через C API, мои только 2, всего их около 15, есть и очень навороченные. Плагины "статические", т.е. собираются вместе с приложением, все исходники есть, расширяться - ну практически вряд ли будут.
Думал может так - расширить/изменить API чтобы в момент когда время поменялось и плагин получает новые данные он сам мог решить равны ли они старым. Но тогда надо перебрать все 15 плюс группы тоже имеют свои данные плюс вкл/выкл. И после всего этого у меня пока нет уверенности что это "правильное и корректное решение".
Может зайти с др стороны - забыть о грузе огромного старого кода (это конечно легко только говорить). Вот мы проектируем новую систему/пайплайн уже вооруженные моим печальным опытом. Как предусмотреть эту ситуацию, т.е. заложить эту оптимизацию в систему?
Записан
ssoft
Программист
Offline
Сообщений: 584
Re: Оптимизация плагинов
«
Ответ #9 :
Октябрь 15, 2016, 09:16 »
Необходимо определить, как мы можем контролировать влияние плагинов.
Если есть возможность запомнить влияние (можно реализовать с помощью класса-обертки поверх сишного API новых/старых плагинов), то запоминаем, а при его отключении влияние убираем.
Если такой возможности нет, то при отключении/включении любого плагина полностью переформируем данные приложения. Других вариаций пока не вижу.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Оптимизация плагинов
«
Ответ #10 :
Октябрь 15, 2016, 11:05 »
Цитата: ssoft от Октябрь 15, 2016, 09:16
Необходимо определить, как мы можем контролировать влияние плагинов.
Если есть возможность запомнить влияние (можно реализовать с помощью класса-обертки поверх сишного API новых/старых плагинов), то запоминаем, а при его отключении влияние убираем.
Если такой возможности нет, то при отключении/включении любого плагина полностью переформируем данные приложения. Других вариаций пока не вижу.
Не понял о чем это, какие "обертки"? Плагин участвует в pipeline
Цитата: Igors от Октябрь 13, 2016, 13:13
2) Эта операция не первая и не последняя в pipeline, которая работает так: есть объект, есть его исходная.базовая геометрия. Она копируется (один раз) и подается на вход операции которая изменяет геометрию и передает ее на вход следующей операции и.т.д. Хранится только оригинал и "что в конце-концов получилось". Поэтому если хоть что-то в pipline изменено - все по новой с нуля, это нормально.
Др словами или вся пайплайн считается или никто, геометрия может быть мульены, поэтому ни о каком восстановлении речь не идет
Записан
ssoft
Программист
Offline
Сообщений: 584
Re: Оптимизация плагинов
«
Ответ #11 :
Октябрь 15, 2016, 12:55 »
То есть в этом случае, нельзя откатить воздействие плагина и данные переформировываются полностью. И вопрос в том, как лучше организовать понимание, изменились ли параметры плагинов, чтобы принять решение формировать данные заново или использовать уже имеющиеся?
Могу предложить либо реализовать параллельное дерево (точно такую же коллекцию, какой связаны плагины) с копией параметров последнего построения, и сначала проверять его на наличие изменений, а затем уже при необходимости задействовать систему плагинов. А лучше, если есть возможность, усложнить узлы дерева плагинов, добавив туда эту информацию.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Оптимизация плагинов
«
Ответ #12 :
Октябрь 15, 2016, 16:27 »
Цитата: ssoft от Октябрь 15, 2016, 12:55
То есть в этом случае, нельзя откатить воздействие плагина и данные переформировываются полностью. И вопрос в том, как лучше организовать понимание, изменились ли параметры плагинов, чтобы принять решение формировать данные заново или использовать уже имеющиеся?
Да, именно так
Цитата: ssoft от Октябрь 15, 2016, 12:55
А лучше, если есть возможность, усложнить узлы дерева плагинов, добавив туда эту информацию.
Ну если это лучше, то зачем предыдущий вариант с параллельным деревом ?
А здесь как-то неясно с "усложнением узлов". Напр в каждом плагине хранить предыдущие данные и сравнивать с новыми - да, реально, но куча тупых if'ов по каждому плагину и группе
Что-то пока не видно фонтана свежих идей
Правда и задачка мерзкая
Записан
ssoft
Программист
Offline
Сообщений: 584
Re: Оптимизация плагинов
«
Ответ #13 :
Октябрь 15, 2016, 21:58 »
Возникла еще такая мысль, с каждым из параметров связать счетчик, сколько плагинов его используют.
Если изменяется параметр, используемый хотя бы одним плагином, тогда формировать данные заново, иначе использовать старые.
При создании/удалении или включении/выключении данные формировать заново.
Это просто идеи, что-бы предложить что-то конкретное, нужно знать детали организации данных.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Оптимизация плагинов
«
Ответ #14 :
Октябрь 16, 2016, 09:12 »
Цитата: ssoft от Октябрь 15, 2016, 21:58
Возникла еще такая мысль, с каждым из параметров связать счетчик, сколько плагинов его используют.
Только "группы" имеют общие параметры используемые входящими в них плагинами, а так вообще параметры у каждого плагина свои
Попробую для начала выделить pipeline в класс - сейчас там все в процедурном стиле. Может после этого придут мысли
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...