Графика в MetaTrader 5: Canvas - рисование внутри буфера с привязкой к объектам - страница 3

 
Renat:
Посмотрите первое сообщение в этой ветке - там и текстом написано "файлы приложены" и файлы в аттаче лежат.

Аааааа! :)

Спасибо.

Ура, заработало !!!

 

Ренату:

Гы. У вас отрабатывается только "глобальный" (терминальный) альфа-канал.

// Кстати - с ошибкой. Чего-то там переполняется местами и цвет предыдущих слоёв искажается при некоторых значениях перекрывающего слоя. Гляньте на досуге. :)

А как-же собственный-канвасовский ?

--

Сделал предварительный (демо) вариант Canvas.mqh с отработкой обоих альфаканалов. Вставил обработку пока только в SetPixel и FillRect.

"Почувствуйте разницу" (с)

Разница на приведённом тесте, естественно, будет заметна если его замедлить, чтоб не мельтешил. :) Как-то вот так:

#include <md_Canvas.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   CCanvas can;
//---
   can.Create("MySpace",0,0,512,512,COLOR_FORMAT_ARGB_NORMALIZE);
   MathSrand(0);
//---
   for(int i=0;i<100;i++)
     {
//      can.FillRect(MathRand()&255,MathRand()&255,256+(MathRand()&255),256+(MathRand()&255),XRGB(MathRand(),MathRand(),MathRand()));      
      can.FillRect(MathRand()&255,MathRand()&255,256+(MathRand()&255),256+(MathRand()&255),ARGB(200,MathRand(),MathRand(),MathRand()));
      can.Circle(MathRand()&511,MathRand()&511,MathRand()&127,XRGB(MathRand(),MathRand(),MathRand()));
      can.Triangle(MathRand()&511,MathRand()&511,MathRand()&511,MathRand()&511,MathRand()&511,MathRand()&511,XRGB(MathRand(),MathRand(),MathRand()));
      //---
      can.Update();  Sleep(2000);
     }
//---
  }
Файлы:
md_canvas.mqh  14 kb
 

Вы используете сырой режим RAW без альфаканала.

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

 
Renat:

Вы используете сырой режим RAW без альфаканала.

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

Угу. Это от недостатка документированности.

Поправил в скрипте. Теперь совсем хорошо.

 

"А всё таки она вертится". В смысле : два альфа-канала (терминальный и канвасовский) лучше чем один.

Добил инклюдник. Теперь все рисовальные функции выводят с учётом обоих альфа-каналов.


Исходник в прицепе. // При скачивании, удалить у инклудника автоматически добавленный постфикс "_1"

Файлы:
 
Кстати, вот именно в этом случае Update() оказалась совсем не лимитирующей скорость. Наверно, потому, что тут больно много MathRand(), да и примитивы сложные.
 
Mathemat:
Кстати, вот именно в этом случае Update() оказалась совсем не лимитирующей скорость. Наверно, потому, что тут больно много MathRand(), да и примитивы сложные.

:)

Все рэндомы меркнут на фоне обработки альфа-канала для каждого пиксела. По хорошему это всё надо делать на SSExx :)

Но и даже так скорость приличная, даже мультики можно городить :)

А альфа-канал надо переписывать. Не нравится мне. На скорость это практически не повлияет, только качество.

Во первых надо разделить альфа каналы. Терминальный задавать для канваса целиком при создании. А родной канвасовский уже обсчитывать индивидуально.

Файлы:
 
Mathemat:
Кстати, вот именно в этом случае Update() оказалась совсем не лимитирующей скорость. Наверно, потому, что тут больно много MathRand(), да и примитивы сложные.

Rand вообще ничего не стоят, а вот Update - самое дорогое, так как это отрисовка всего чарта со всеми объектами, условиями отображения всех торговых уровней и тд.

Кстати, альфаканал отрисовывается через функцию AlphaBlend, которая хорошо ускоряется с помощью видеокарты.

Если видеосистема слабая как у слабых/древних ноутбуков, то простой ChartRedraw будет сильно тормозить.

 
Renat: Если видеосистема слабая как у слабых/древних ноутбуков, то простой ChartRedraw будет сильно тормозить.
А почему бы не ввести в ChartRedraw() параметр, специфицирующий именно то, что надо обновлять?
 
Mathemat:
А почему бы не ввести в ChartRedraw() параметр, специфицирующий именно то, что надо обновлять?

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

Поэтому обновления требует все окно.

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