Делаем краудсорсовый проект по Canvas - страница 32

 
Алексей Барбашин:

Я именно так и построил. В принципе за основу я взял стандартную библиотеку, так как в ней очень хорошо проработаны моменты передачи событий и некоторые другие моменты. Анатолий создает группировку под каждый различный класс элементов, в стандартной же все приводится к единому базовому объекту.

...

Николай в своих примерах показывает что в принципе не стоит заморачиваться над хранением данных локальных областей поскольку перерисовка всего канваса работает настолько быстро что нет необходимости опускаться да частностей, достаточно всегда перерисовывать все сразу.
Не все так просто. Представьте, вы нарисовали большую (на весь график) таблицу, в которой одна из ячеек меняет значение 20 раз в секунду. Если вы будете перерисовывать весь канвас, нагрузка на процессор возрастет до 40% и более. Абсолютно неправильная работа с канвасом. Перерисовывать нужно отдельные элементы, иначе таблицы, стакан и разные локальные анимации будут перегружать процессор и тормозить выполнение других функций (если они в общем потоке).
 
Реter Konow:
Не все так просто. Представьте, вы нарисовали большую (на весь график) таблицу, в которой одна из ячеек меняет значение 20 раз в секунду. Если вы будете перерисовывать весь канвас, нагрузка на процессор возрастет до 40% и более. Абсолютно неправильная работа с канвасом. Перерисовывать нужно отдельные элементы, иначе таблицы, стакан и разные локальные анимации будут перегружать процессор и тормозить выполнение других функций (если они в общем потоке).

Эксперименты Николая пока доказывают обратное. Он за один проход перерисовывает все содержимое канваса и это однозначно видно в коде.

Но я все же сторонник локальных изменений. Но при таком подходе есть свои определенные трудности, которые я пока еще не решил.

 
Алексей Барбашин:

Эксперименты Николая пока доказывают обратное. Он за один проход перерисовывает все содержимое канваса и это однозначно видно в коде.

Но я все же сторонник локальных изменений. Но при таком подходе есть свои определенные трудности, которые я пока еще не решил.

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

Суть в следующем: Канвас - это массив данных. Данные меняются и сохраняются заново на событиях изменений. Если массив включает в себя все пиксели пространства графика - то его размер = высота*ширина графика. Если внутри массива происходит локальное изменение значений пикселей, то нет необходимости делать полный цикл по всему массиву и переустанавливать все значения. Нужно сделать цикл по измененной области, поставить значения и выйти из цикла. Иначе, как ни крути, - перерасход ресурсов и времени.

А трудностей при таком подходе немало. Главная - нужно создавать свои полноценные объекты, находить и обрабатывать их на своем канвасе. Штатный CCanvas для этого не подходит. Он не "увидит" ваши элементы и через него вы не обратитесь к ним. Там нет такого функционала.

 
Реter Konow:

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

Суть в следующем: Канвас - это массив данных. Данные меняются и сохраняются заново на событиях изменений. Если массив включает в себя все пиксели пространства графика - то его размер = высота*ширина графика. Если внутри массива происходит локальное изменение значений пикселей, то нет необходимости делать полный цикл по всему массиву и переустанавливать все значения. Нужно сделать цикл по измененной области, поставить значения и выйти из цикла. Иначе, как ни крути, - перерасход ресурсов и времени.

А трудностей при таком подходе немало. Главная - нужно создавать свои полноценные объекты, находить и обрабатывать их на своем канвасе. Штатный CCanvas для этого не подходит. Он не "увидит" ваши элементы и через него вы не обратитесь к ним. Там нет такого функционала.

Я прекрасно все это понимаю и осознаю. У меня созданы свои классы объектов и все это прекрасно работает.

 
Алексей Барбашин:

Я прекрасно все это понимаю и осознаю. У меня созданы свои классы объектов и все это прекрасно работает.

В этом случае, можете проверить создав таблицу и обновляя ее двумя способами - локально (каждую ячейку отдельно) и разом всю таблицу.

 

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

Сама частота - 5 раз в секунду, может возникнуть в таблице, где значения меняются асинхронно. Такая ситуация возникала у меня на МТ4, когда я подключал таблицу к тестеру через ресурсы. Там при скорости 31 все параметры меняются столь быстро, что неправильная перерисовка таблицы приводила к нагрузке процессора 50% и более процентов. Даже локальная перерисовка элементов полностью не спасала. Я придумал замедлять скорость выведения значений. Сами значения менялись с естественной скоростью, но выводились в ячейки в несколько раз реже. Это позволило решить проблему.

Вот пример. 1000 ячеек должны менять значения на частоте 25мс. На деле, ячейки меняют значения примерно раз в 500 мс и нагрузка на процессор около 50%. (Это МТ4 и таблица рисованная).

https://www.mql5.com/ru/forum/293630/page160


Вот пример с тестером. Таблица рисованная, но процессор от перегрузки это не спасает. :) (скорость тестера 31, обновление ячеек полное (без пропуска выводов)).

https://www.mql5.com/ru/forum/293630/page148

 
Реter Konow:
Не все так просто. Представьте, вы нарисовали большую (на весь график) таблицу, в которой одна из ячеек меняет значение 20 раз в секунду. Если вы будете перерисовывать весь канвас, нагрузка на процессор возрастет до 40% и более. Абсолютно неправильная работа с канвасом. Перерисовывать нужно отдельные элементы, иначе таблицы, стакан и разные локальные анимации будут перегружать процессор и тормозить выполнение других функций (если они в общем потоке).

Мне не совсем понятно откуда у Вас такие цифры. Посмотрите совершенно простой пример Николая https://www.mql5.com/ru/forum/227736/page44#comment_13445909. На канвасе размером с график генерится несколько объектов, которые можно перетаскивать по графику (по канвасу). При этом выполняется перерисовка всего канваса. Торможений никаких нет.

Canvas - это круто!
Canvas - это круто!
  • 2019.09.20
  • www.mql5.com
Поставил себе задачу: коротким кодом эффектно продемонстрировать возможности пользовательской графики через класс CCanvas...
 
Алексей Барбашин:

Мне не совсем понятно откуда у Вас такие цифры. Посмотрите совершенно простой пример Николая https://www.mql5.com/ru/forum/227736/page44#comment_13445909. На канвасе размером с график генерится несколько объектов, которые можно перетаскивать по графику (по канвасу). При этом выполняется перерисовка всего канваса. Торможений никаких нет.

Посмотрите выше примеры.

Вставил ссылки на гифы.
 

Вот пример замедления вывода значений в ячейки и снижения нагрузки на процессор:


https://www.mql5.com/ru/forum/293630/page148

 
Алексей Барбашин:

Мне не совсем понятно откуда у Вас такие цифры. Посмотрите совершенно простой пример Николая https://www.mql5.com/ru/forum/227736/page44#comment_13445909. На канвасе размером с график генерится несколько объектов, которые можно перетаскивать по графику (по канвасу). При этом выполняется перерисовка всего канваса. Торможений никаких нет.

В том примере обычная частота обновления. Поэтому не тормозит. 

Причина обращения: