Круто, безусловно!
И даже для полезных вещей может использоваться ;)
Круто, безусловно!
И даже для полезных вещей может использоваться ;)
Для того чтобы народ начал юзать канвас в полезных вещах, нужно начать с демонстрации бесполезных вещей. :))
Необходимо перед компиляцией в файле Canvas.mqh перенести массив m_pixels[] из protected: в public:
Можно ничего не менять в СБ.
class CCanvas2 : public CCanvas { private: int Pos; public: CCanvas2* operator []( const int iPos ) { this.Pos = iPos; return(&this); } void operator =( const uint Color ) { this.m_pixels[this.Pos] = Color; } };
CCanvas2 C; //.. // C.m_pixels[pos]=XRGB(h[int(d*11520)],h[int(d*17920)],h[int(d*6400)]); C[pos]=XRGB(h[int(d*11520)],h[int(d*17920)],h[int(d*6400)]);
Можно ничего не менять в СБ.
Прикольно! :))
Но к сожалению, это не бесплатно.
Проверил. Общее замедление на MT5 составило ~11%
Прикольно! :))
Но к сожалению, это не бесплатно.
Проверил. Общее замедление на MT5 составило ~11%
В Вашем случае от CCanvas используется 1%. Без CCanvas попробуйте. Код будет ни капли не сложнее, а скорость еще повысится.
В Вашем случае от CCanvas используется 1%. Без CCanvas попробуйте. Код будет ни капли не сложнее, а скорость еще повысится.
Конечно, можно обойтись и без класса CCanvas. Но код увеличиться, а выйгрыша по скорости не будет, т.к. по сути из класса CCanvas я использую только массив точек графического ресурса m_pixels[] ( ну и еще функции Update() и Destroy(), но ими можно пренебречь, т.к. на них не сэкономишь).
А массив - он и в Африке массив. Как на нем можно повысить скорость? Никак. Просто класс CCanvas берет на себя некоторую рутину при создании ресурса, его обновлению (точнее пересозданию) и удалению.
Или Вы хотите сказать, что C.m_pixels[] компилируется не как прямой доступ к массиву? По-моему, как прямой. Без всяких там промежуточных телодвижений. Или я ошибаюсь?
А еще логичнее было бы разработчикам этого класса запихнуть CreateBitmapLabel в конструктор самого класса, чтоб не маячил. Если создается новый экземпляр класса без параметров, то создается холст с размером в окно ( как в моем случае), а при желании можно при создании экземпляра класса и параметры указывать. Лично у себя я так и сделал.
Конечно, можно обойтись и без класса CCanvas. Но код увеличиться, а выйгрыша по скорости не будет, т.к. по сути из класса CCanvas я использую только массив точек графического ресурса m_pixels[] ( ну и еще функции Update() и Destroy(), но ими можно пренебречь, т.к. на них не сэкономишь).
А массив - он и в Африке массив. Как на нем можно повысить скорость? Никак. Просто класс CCanvas берет на себя некоторую рутину при создании ресурса, его обновлению (точнее пересозданию) и удалению.
Или Вы хотите сказать, что C.m_pixels[] компилируется не как прямой доступ к массиву? По-моему, как прямой. Без всяких там промежуточных телодвижений. Или я ошибаюсь?
CCanvas - обертка ResourceCreate. Поэтому, например, есть у Вас уже 20 готовых картинок в виде массивов. Если захотите их сменять через канвас, то надо будет постоянно делать дорогой ArrayCopy+Update.
А если делать без CCanvas, то все выльется только в ResourceCreate+ChartRerdraw. В кодобазу выкладывал несколько работ с динамическим рисованием. Там было очевидно, что CCanvas не годится.
Конечно поможет, но будут жуткие тормоза. Во-первых вызов функции это уже не бесплатно, т.к. осуществляется передача и сохранение параметров (в PixelSet это происходит даже не по ссылке), все регистры нужно в стек засунуть, а потом обратно вытащить. Во-вторых, в самой функции происходят проверки на попадания X и Y в заданный диапазон, в-третьих, происходит вычисление индекса массива. А это все мне не требуется, т.к. индекс уже имеется, а быть вне диапазона в моем алгоритме невозможно.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Поставил себе задачу: коротким кодом эффектно продемонстрировать возможности пользовательской графики через класс CCanvas.
Вот что из этого получилось.
Данный скрипт работает как на MQL5, так и на MQL4. Только на MT5 гораздо быстрее.
Каждый кадр уникален и не повторяется, то есть скрипт не цикличный.
Необходимо перед компиляцией в файле Canvas.mqh перенести массив m_pixels[] из protected: в public: