Canvas - это круто! - страница 94

 

У меня возникла серьезная проблема с мерцанием в mql4 при использовании холста.

Первой моей мыслью было аппаратное обеспечение, но после тестирования я практически исключил эту возможность. Затем я проверил chart-events, так как у меня много событий и в прошлом я дублировал вызовы для отрисовки холста. С этим тоже вроде бы все в порядке.

Я обнаружил, что проблема заключается в изменении размера... А именно: ArrayInitialize(m_pixels, 0) ; На светлом BG он мигает черным, прежде чем Erase сбрасывает светлый цвет.


Я думаю, что я решил эту проблему (кажется, что это работает), но я новичок в oop.


class MyCanvas : public CCanvas
{
public:
        CCanvas(void);
       ~CCanvas(void);
   
   bool Resize_Erase(const int width, const int height, const uint clr)
   {
      if(m_rcname!=NULL && width>0 && height>0)
         if(ArrayResize(m_pixels,width*height)>0)
         {
            m_width =width;
            m_height=height;
            ArrayInitialize(m_pixels, clr);
            if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format))
            {
               if(m_objname!=NULL && ObjectSetString(m_chart_id,m_objname,OBJPROP_BMPFILE,m_rcname))
                  return(true);
            }
         }
//--- error - destroy object
      Destroy();
      return(false);
   }
};
 
Jon_G #:

У меня возникла серьезная проблема с мерцанием в mql4 при использовании холста.

Первой моей мыслью было аппаратное обеспечение, но после тестирования я практически исключил эту возможность. Затем я проверил chart-events, так как у меня много событий и в прошлом я дублировал вызовы для отрисовки холста. С этим тоже вроде бы все в порядке.

Я обнаружил, что проблема заключается в изменении размера... А именно: ArrayInitialize(m_pixels, 0) ; На светлом BG он мигает черным, прежде чем Erase сбрасывает светлый цвет.


Я думаю, что я решил эту проблему (кажется, что это работает), но я новичок в oop.

Это плохая практика каждый раз пересоздавать объект canvas. Это очень затратная процедура, поэтому мерцание неизбежно.
Советую, рассмотрите вариант, когда объект канваса создается один раз при инициализации на все окно и меняет размеры только при изменении размера самого окна чарта. 
Если вам не нужен весь размер окна, то создайте максимально возможный размер и не меняйте его, а только перемещайте.
На много удобнее и произодительнее работать с этим классом:

https://www.mql5.com/ru/code/22164 - MT5
https://www.mql5.com/en/code/23840 - MT4

 

Извините, конструкт/деструктор не должен быть там. Наверное, я допустил ошибку в C&P.

 
Jon_G #:

Извините, конструкт/деструктор не должен быть там. Наверное, я допустил ошибку в C&P.

Конструктор/деструктор здесь ни причем.
 
Nikolai Semko #:


Я предлагаю рассмотреть возможность создания объекта canvas один раз при инициализации для всего графика и изменять его размер только при изменении размера самого окна графика.


Именно так я и поступал.


" Создайте максимально возможный размер и не изменяйте его, только перемещайте. "

Спасибо, я подумаю над этим.

 
Jon_G #:


Именно этим я и занимался.


" Создайте максимально возможный размер и не изменяйте его, только перемещайте. "

Спасибо, я подумаю над этим.


bool iCanvas::MoveCanvas(const int x,const int y) {
   if(ObjectSetInteger(m_chart_id,m_objname,OBJPROP_XDISTANCE,x) && ObjectSetInteger(m_chart_id,m_objname,OBJPROP_YDISTANCE,y))  return(true);
   else return(false);
}
 
Nikolai,
Affine transform indicator https://www.mql5.com/ru/code/9378 converts price data in a diffrent dimension.Can you combine the canvas channels with affine transform?So we can. view the price data in diffrent dimensions?
 
невозможно #:
Николай,
Индикатор аффинного преобразования  https://www.mql5.com/ru/code/9378 преобразует данные о ценах в разных измерениях. Можно ли объединить каналы холста с аффинным преобразованием? Мы можем. просмотреть данные о ценах в разных измерениях?

Конечно это возможно

Например, на этом видео, аппроксимации и экстраполяция Фурье рассчитывается после таких преобразований в каждом параболическом канале:


После расчета Фурье происходит обратное преобразование для вывода линии Фурье на график.
 
Просто демонстрация возможностей Canvas.
Видео не ускорено, все работает без лагов.
OpenCL и DirectX не использовались.
Если использовать  OpenCL, то процессор не вообще не будет нагружаться.
Но даже с использованием простого процессора время формирования одного кадра в среднем 5 -15 миллисекунд. 


 
Nikolai Semko #:
Просто демонстрация возможностей Canvas.
Видео не ускорено, все работает без лагов.
OpenCL и DirectX не использовались.
Если использовать  OpenCL, то процессор не вообще не будет нагружаться.
Но даже с использованием простого процессора время формирования одного кадра в среднем 5 -15 миллисекунд. 


Отрисова в onTimer() находится? Если да, то какой Event в миллисекундах установлен?

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