Russian Qt Forum
Июнь 16, 2024, 23:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Оптимизация плагинов  (Прочитано 7871 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Октябрь 13, 2016, 10:29 »

Добрый день

Да, понимаю что лезть в чужой (и страшно большой) код опасно, но вот "надо".
Есть объект на который можно прицепить любое число плагинов которые организованы по группам. Примерная схема
Цитировать
Объект (все плагины работают с его геометрией)
  - Группа плагинов 1
     - плагин 1_1    
     - плагин 1_2
     ...
  - Группа плагинов 2
     - плагин 2_1    
     - плагин 2_2
     ...
Как плагины так и группы имеют параметры и запрашивают их у хоста (ну то есть у меня). Как плагины так и группы могут быть вкл/выкл юзером и их порядок применения может быть изменен. Параметры есть значения на линейке времени, по-нашему "анимейшн курва".

И вот требуется, казалось бы, очень простая вещь - если во времени ничего не меняется, то и плагины не дергать попусту. Сейчас тупо считает каждом фрейме, конечно жуткие тормоза.

Что бы Вы предложили? Какой метод? Ну может пресловутые "паттерны" помогут? Улыбающийся

Спасибо
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Октябрь 13, 2016, 13:13 »

Можно смотреть на каждом фрейме, есть ли на таймлайне изменения касательно вкл-выкл плагина и изменения параметров. Если нет - применять предыдущие (т.е. актуальные) рассчитанные данные.
Ну вот, в очередной раз моя тема сваливается в диалог с Вами Улыбающийся Вообще, впечатление что проблемы только у меня, у остальных их просто нет (ну может что-то там не ладится с портами).

Сделать "слепок" и потом его сравнивать конечно напрашивается, но тут возникают неприятные моменты

1) Где этот "слепок" хранить? И как? (в смысле что туда писать). Напр указатель на плагин или группу плагинов- но его юзер может грохнуть.  Что тогда? Сидеть с невалидным указателем - ну как минимум получу ABA. А отслеживать всю активность юзера - не знаю возможно или нет, но как минимум очень накладно

2)  Эта операция не первая и не последняя в pipeline, которая работает так: есть объект, есть его исходная.базовая геометрия. Она копируется (один раз) и подается на вход операции которая изменяет геометрию и передает ее на вход следующей операции и.т.д. Хранится только оригинал и "что в конце-концов получилось". Поэтому если хоть что-то в pipline изменено - все по новой с нуля, это нормально. И тут "слепок" надо как-то прибивать, хз как
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Октябрь 13, 2016, 17:28 »

1. Ну как минимум плагины не по "указателю" тогда хранить, а по Id. Менеджер плагинов должен знать, какой плагин жив, а какой уже отошел.
Это щас мы такие умные по Id хранить. А код писался в ранние 90-е (typedef struct и все такое)

2. А разве параметры не хранятся на таймлайне? Ну т.е. я бы предположил, что параметры разделены по плагинам, и привязка однозначна.
Совершенно однозначна, что создает иллюзию легкого решения (ну вот же, рукой подать)

Например, в момент Т1 был активирован плагин Р1 с одними параметрами, а в момент Т2 - плагин Р2, но при этом Т1 еще не был деактивирован. Но тогда на таймлайне в Т2 будет только команда активации Р2 и его параметры. Т1 как был активен, так и остается.
Не понял. (де)Активация - это просто флажки, они хранятся но на линейке времени их нет

Похоже "только с этой операцией" не удастся - надо завязываться на весь pipeline. А там страшнЭ
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Октябрь 14, 2016, 16:10 »

Т.е. в смысле, заранее известно какие плагины отключены, а какие нет?
Да

Тут полазил в коде. Хреново. Во-первых многие плагины имеют неанимированные параметры (те же флажки) которых на линейке времени нет. Ну ладно, это еще как-то решаемо, напр "закрыли окно UI плагина - общий сброс", один лишний пересчет - мелочь. Но раскопал 2-3 плагина, эти уроды могут ссылаться/используют вообще др (внешние) объекты, а те могут меняться во времени как угодно.
Цитировать
А это ппц - подумал Штирлиц
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #7 : Октябрь 15, 2016, 07:10 »

Не знаю, возможно ли это в данной ситуации, все зависит от корректности реализации плагинов.
Я когда-то использовал такую схему, если флажок есть, то плагины подгружаются и регистрируются (диспетчером), создаются объекты со всем необходимыми ассоциациями (например, диспетчер хранит соотношение объектов и плагина). Если флажок снимается, то необходимо полностью вернуть систему в исходное состояние (диспетчер удаляет объекты, поправляет параметры) и полностью выгрузить плагин. Однако данная схема не работает, если нет механизма чистки за собой ресурсов, параметров и др.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Октябрь 15, 2016, 08:41 »

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

Думал может так - расширить/изменить API чтобы в момент когда время поменялось и плагин получает новые данные он сам мог решить равны ли они старым. Но тогда надо перебрать все 15 плюс группы тоже имеют свои данные плюс вкл/выкл. И после всего этого у меня пока нет уверенности что это "правильное и корректное решение".

Может зайти с др стороны - забыть о грузе огромного старого кода (это конечно легко только говорить). Вот мы проектируем новую систему/пайплайн уже вооруженные моим печальным опытом. Как предусмотреть эту ситуацию, т.е. заложить эту оптимизацию в систему?
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #9 : Октябрь 15, 2016, 09:16 »

Необходимо определить, как мы можем контролировать влияние плагинов.

Если есть возможность запомнить влияние (можно реализовать с помощью класса-обертки поверх сишного API новых/старых плагинов), то запоминаем, а при его отключении влияние убираем.
Если такой возможности нет, то при отключении/включении любого плагина полностью переформируем данные приложения. Других вариаций пока не вижу.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Октябрь 15, 2016, 11:05 »

Необходимо определить, как мы можем контролировать влияние плагинов.

Если есть возможность запомнить влияние (можно реализовать с помощью класса-обертки поверх сишного API новых/старых плагинов), то запоминаем, а при его отключении влияние убираем.
Если такой возможности нет, то при отключении/включении любого плагина полностью переформируем данные приложения. Других вариаций пока не вижу.
Не понял о чем это, какие "обертки"? Плагин участвует в pipeline
2)  Эта операция не первая и не последняя в pipeline, которая работает так: есть объект, есть его исходная.базовая геометрия. Она копируется (один раз) и подается на вход операции которая изменяет геометрию и передает ее на вход следующей операции и.т.д. Хранится только оригинал и "что в конце-концов получилось". Поэтому если хоть что-то в pipline изменено - все по новой с нуля, это нормально.
Др словами или вся пайплайн считается или никто, геометрия может быть мульены, поэтому ни о каком восстановлении речь не идет
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #11 : Октябрь 15, 2016, 12:55 »

То есть в этом случае, нельзя откатить воздействие плагина и данные переформировываются полностью. И вопрос в том, как лучше организовать понимание, изменились ли параметры плагинов, чтобы принять решение формировать данные заново или использовать уже имеющиеся?

Могу предложить либо реализовать параллельное дерево (точно такую же коллекцию, какой связаны плагины) с копией параметров последнего построения, и сначала проверять его на наличие изменений, а затем уже при необходимости задействовать систему плагинов. А лучше, если есть возможность, усложнить узлы дерева плагинов, добавив туда эту информацию.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Октябрь 15, 2016, 16:27 »

То есть в этом случае, нельзя откатить воздействие плагина и данные переформировываются полностью. И вопрос в том, как лучше организовать понимание, изменились ли параметры плагинов, чтобы принять решение формировать данные заново или использовать уже имеющиеся?
Да, именно так

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

Что-то пока не видно фонтана свежих идей Улыбающийся Правда и задачка мерзкая
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #13 : Октябрь 15, 2016, 21:58 »

Возникла еще такая мысль, с каждым из параметров связать счетчик, сколько плагинов его используют.
Если изменяется параметр, используемый хотя бы одним плагином, тогда формировать данные заново, иначе использовать старые.
При создании/удалении или включении/выключении данные формировать заново.
Это просто идеи, что-бы предложить что-то конкретное, нужно знать детали организации данных.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Октябрь 16, 2016, 09:12 »

Возникла еще такая мысль, с каждым из параметров связать счетчик, сколько плагинов его используют.
Только "группы" имеют общие параметры используемые входящими в них плагинами, а так вообще параметры у каждого плагина свои

Попробую для начала выделить pipeline в класс - сейчас там все в процедурном стиле. Может после этого придут мысли
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.12 секунд. Запросов: 22.