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

 

.

Вот видео, которое обещал опубликовать. Качество изображения плохое, но оно не мешает увидеть задержки реакции.

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

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

(Поэтому я сделал несколько окон разных размеров.)

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

Думаю, дело в этом.

P.S. Забыл добавить, что общее кол-во объектов всех окон - 35.

 
Реter Konow:

.

Вот видео, которое обещал опубликовать. Качество изображения плохое, но оно не мешает увидеть задержки реакции.

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

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

(Поэтому я сделал несколько окон разных размеров.)

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

Думаю, дело в этом.

P.S. Забыл добавить, что общее кол-во объектов всех окон - 35.

Есть ли возможность взглянуть на исходники ? Мне для себя, для опыта .
 
Vladimir Pastushak:
Есть ли возможность взглянуть на исходники ? Мне для себя, для опыта .
Да, вот на этой странице я выложил блок функций которые совместно рисуют все эти окна. https://www.mql5.com/ru/forum/92113/page16
Делаем краудсорсовый проект по Canvas
Делаем краудсорсовый проект по Canvas
  • www.mql5.com
Приветстсвую кодеров. Есть интересная задача сделать действительно что-то полезное, и думаю что краудсорс будет хорошим вариантом...
 
Проблема задержки реакции решена. Решение было следующим: 

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

Поясню в чем была проблема:

Прежде, при рисовании деталей изображения, я делал цикл по всей площади изображения и именно это и создавало задержку. При площади окна 500*500 пикселей, нужно было при каждой его перерисовке, перерисовывать порядка 300 деталей изображения, и того получалось :(500×500×300×кол-во рисующих фунций) интераций в циклах при каждой перерисовке. Это как оказывается занимает время даже у компьютера.
 
Решение было следующим: вместо того, чтобы заново рисовать изображение на каждом событии требующим перерисовки конкретной детали внутри изображения, я рисую изображение один раз, а при следующих перерисовках возвращаю его в массив с помощью ResourceReadImage().

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





 
Реально ли ускорить отрисовку в Canvas с помощью OpenCL?
 
Timur Gatin:
Реально ли ускорить отрисовку в Canvas с помощью OpenCL?


Да. У OCL есть возможность распараллелить обработку + возможность оперировать векторами - это ускоряет процесс отрисовки/наложения.

Подробнее про использование векторов в статье Mathemat'a    https://www.mql5.com/ru/articles/407

OpenCL: от наивного кодирования - к более осмысленному
OpenCL: от наивного кодирования - к более осмысленному
  • 2012.06.05
  • Sceptic Philozoff
  • www.mql5.com
В данной статье продемонстрированы некоторые возможности оптимизации, открывающиеся при хотя бы поверхностном учете особенностей "железа", на котором исполняется кернел. Полученные цифры весьма далеки от предельных, но даже они показывают, что при том наборе возможностей, который имеется здесь и сейчас (OpenCL API в реализации разработчиков терминала не позволяет контролировать некоторые важные для оптимизации параметры - - в частности, размер локальной группы), выигрыш в производительности в сравнении с исполнением хостовой программы очень существенен.
 
Igor Volodin:


Да. У OCL есть возможность распараллелить обработку + возможность оперировать векторами - это ускоряет процесс отрисовки/наложения.

Подробнее про использование векторов в статье Mathemat'a    https://www.mql5.com/ru/articles/407

Вы не сравнивали скорость Erase() из CCanvas и цикл по PixelSet() сделанный на OpenCl? По идее, при хорошем ускорении можно сделать тупой код рисования без кеширования промежуточных результатов и прочих сложностей.

Кстати, слои смешиваете по этой формуле?


 

Да, формула из википедии, для каждого компонента цвета: Result = Background + (Foreground − Background) * Alpha;

А с Erase, кстати, засада в OCL. Аналога memset нет (в отличии от CUDA). Поэтому сейчас приходится делать Erase в хосте и копировать зачищенный массив через CLBufferWrite, что точно не быстрее простого Erase.
Делать же массив задач для work-юнитов записывающих по 1 точке в массив пробовал, но не помню по скорости - выходило вроде медленней предыдущего способа.

А в OCL 1.2 есть clEnqueueFillBuffer() который это делает  => по синтаксису MQL должен быть CLBufferFill()  

Но эта обертка не реализована (т.к. портирована версия 1.1).

 
Igor Volodin:

Да, формула из википедии, для каждого компонента цвета: Result = Background + (Foreground − Background) * Alpha;

А с Erase, кстати, засада в OCL. Аналога memset нет (в отличии от CUDA). Поэтому сейчас приходится делать Erase в хосте и копировать зачищенный массив через CLBufferWrite, что точно не быстрее простого Erase.
Делать же массив задач для work-юнитов записывающих по 1 точке в массив пробовал, но не помню по скорости - выходило вроде медленней предыдущего способа.

А в OCL 1.2 есть clEnqueueFillBuffer() который это делает  => по синтаксису MQL должен быть CLBufferFill()  

Но эта обертка не реализована (т.к. портирована версия 1.1).

В английской вике формула интереснее, можно смешать два полупрозрачных слоя. Это можно сделать полупрозрачный интерфейс и прочие красивости.
 
Timur Gatin:
В английской вике формула интереснее, можно смешать два полупрозрачных слоя. Это можно сделать полупрозрачный интерфейс и прочие красивости.

А это в моем случае не понадобилось, все смешивается корректно. Все что ниже -слоя А можно считать подложкой, даже если на ней слой B через который просвечивает сама подложка.
Причина обращения: