Альтернативные реализации стандартных функций/подходов - страница 13

 
Реter Konow:

Вот так выглядит начало блока:

Насколько я тебя понял, ты создал свой язык интерпретатор. 

  • сам интерфейс ты создаешь как текстовый файл именно на этом языке
  • потом по аналогии с Java машиной, само тело главной программы, загружает этот текстовый файл и преобразует его в понятный ей "байт-код", по сути массив. 
  • из этого массива и происходит формирование изображений интерфейса

Примерно так?

И еще глупый вопрос:

каждое сформированное окно с различными элементами - это один ресурс или множество?

ЗЫ Хотя наверное лучшей аналогией был бы язык HTML

Как я раньше говорил - твоему детищу нужен графический конструктор. Что-то вроде, как у Андрея Баринова.

А еще видеоролики у тебя слишком длинные. С 45 минут их нужно сократить до 5 мин, а лучше до 3

 
A100:

А самостоятельно не пробовали найти ответ на вопрос?

Подсказка: в строке поиска google указать "DBL_MANT_DIG 53 52"

Ага, спасибо. Нашел.

 
Nikolai Semko:

1. Насколько я тебя понял, ты создал свой язык интерпретатор. 

  • сам интерфейс ты создаешь как текстовый файл именно на этом языке
  • потом по аналогии с Java машиной, само тело главной программы, загружает этот текстовый файл и преобразует его в понятный ей "байт-код", по сути массив. 
  • из этого массива и происходит формирование изображений интерфейса

Примерно так?

2. И еще глупый вопрос:

каждое сформированное окно с различными элементами - это один ресурс или множество?

ЗЫ Хотя наверное лучшей аналогией был бы язык HTML

Как я раньше говорил - твоему детищу нужен графический конструктор. Что-то вроде, как у Андрея Баринова.

А еще видеоролики у тебя слишком длинные. С 45 минут их нужно сократить до 5 мин, а лучше до 3

1. Да, оказывается определение "интерпретатор" лучше всего подходит к тому, что я создал (хотя, в процессе создания я не имел понятия, что это такое).

  • Да, верно. Интерфес создается как текстовый файл. Точнее, осуществляется прямая инициализация массива "string SOURCE[]" внутри подключенного к индикатору файла. (Пользователь пишет "KIB-код" и тем самым инициализирует массив). Далее, файл индикатора компилируется пользователем, и содержимое массива с помощью EventChartCustom() передается в Конструктор (советник). 

  • Внутри конструктора осуществляется принятие пользовательского "KIB-кода" в виде "нарезки" из строк. Каждая переданная строка это объединение из 128 символов. Эти строки дробятся и записываются в копию массива SOURCE на стороне Конструктора. Потом, запускается "Блок построения ядра", который превращает содержание массива "SOURCE" в содержание массива "int G_CORE[][]". Это и есть "ядро". Блок преобразующий одно содержимое в другое, более 5000 строк кода (состоит из набора функций). 
  • .
  • Преобразование происходит с помощью промежуточного массива "int TEMPLATES[]", в котором собраны прототипы всех элементов и платформ окон. По инструкции из "SOURCE[]" (созданной пользователем), осуществляется сборка главного ядра. Берутся шаблоны элементов из "TEMPLATES" и преобразуясь, помещаются в "G_CORE".
  • .
  • Когда ядро построено, "движок" (часть конструктора отвечающая за управление механикой GUI) начинает работать с построенным ядром. Рисует нужные канвасы и открывает окна. 

2. Каждое сформированное окно, - это несколько канвасов (ресурсов). Первые два, - это платформа окна. Раньше я использовал другой метод рисования и потому некоторые детали были полупрозрачными и через них был виден график. Чтобы этого избежать, я добавил еще один канвас на задний план. Потом технология улучшилась, но канвас на заднем плане так и остался. Он "врос" в технологию и сейчас от него сложно избавиться. Но в конце концов, я уберу его, и платформа окна будет состоять из одного канваса.

Также, "поля" (переключаемые вкладками изображения), это самостоятельные канвасы. Они содержат уже готовые изображения и потому переключение происходит максимально быстро. Если бы я рисовал все на одном канвасе, неминуемо, переключение изображений было бы медленнее. Приходилось бы заново перерисовывать.  В общем, подумав я пришел к выводу, что это оптимальный вариант.


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


ЗЫ. Особенностью моей разработки является стихийность. Я не был знаком ни с интерпертаторами, ни с языком HTML, и не знал, как они работают. Однако, это ничуть не мешает творить и создавать похожее. Думаю, если это хорошо получается, то так и буду продолжать. :)

 
Реter Konow:

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

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

Производительности MQL5 должно быть достаточно, чтобы формировать весь интерфейс на лету, не имея готовых блоков в памяти, если грамотно кодить.

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

В твоем подходе вижу пока одно большое преимущество:

Тебе будет легче создать полноценный графический конструктор, т.к. легче сгенерировать разметочный код, а не сам MQL код.  


Но это слоновая задача.
 
Nikolai Semko:

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

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

Производительности MQL5 должно быть достаточно, чтобы формировать весь интерфейс на лету, не имея готовых блоков в памяти, если грамотно кодить.

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

В твоем подходе вижу пока одно большое преимущество:

Тебе будет легче создать полноценный графический конструктор, т.к. легче сгенерировать разметочный код, а не сам MQL код.  


Но это слоновая задача.

Относительно небольшой перерасход памяти все же имеется. Ты прав. Такие объекты элементов как текст или иконка, "незаслуженно" получают ряд из 235-ти свойств в ядре, в то время, как их собственных свойств в несколько раз меньше. Главный объект элемента, а именно основание, должен иметь все 235 свойств, но объекты иконок и текстов имеют меньше свойств. Это создает перерасход памяти.

По идеи, если добавлю еще 60 ячеек к ряду главных объектов элементов, то смогу поместить в них свойства текста и иконки. Это сделает ядро "шире", но можно будет убрать две трети объектов.

Будет отличная экономия памяти и выйгрыш в скорости построения ядра. Однако, технически это трудно выполнимо. Нужно много переделывать. Пока, расход памяти и время построения вполне приемлимы. Но, нет предела совершенству...


Использовать один канвас не очень хорошая идея. Да и какой смысл?  Значительно проще использовать один канвас для каждого окна, и один канвас для каждого поля. Общий канвас перерисовывать нужно значительно чаще. На каждом переключении изображения, или на каждом сдвиге окна. На прокрутке... Нужно принять во внимание, что перерисовка не всегда быстрая. Дело не в алгоритмах, а в "навороченности" графики. Объясню:

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

Если ты рисуешь квадрат с рамкой, то это два цикла по массиву пикселей.

Если ты рисуешь квадрат с рамкой и иконкой, то это три цикла.

Если ты рисуешь квадрат с рамкой, у которого есть градиент поверхности и иконкой у которой есть тень, то это четыре и более цикла по массиву пикселей.

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

Один канвас на все изображения, заставит перерисовывать все беспрерывно. Поэтому, это не подходящее решение.


ЗЫ. Задача конечно слоновая, но я справлюсь. Хотя и не откажусь от помощи.))

ЗЫЫ. Спасибо за видео, вдохновляет! :)

 
Реter Konow:


А у тебя размер окна меняется с помощью мышки?
Если да, то красный квадратик появляется?

 
Nikolai Semko:

А у тебя размер окна меняется с помощью мышки?
Если да, то красный квадратик появляется?

Я не понял о каких квадратиках речь.

Размеры динамичного окна меняются с помощью мышки. А как иначе?


ЗЫ. Динамичное окно изначально имеет размер полного экрана. Далее, оно "обрезается" до нужных размеров. То есть, вся его динамичность реализуется в заранее установленном максимальном пространстве уже созданного битмапа.

 

В продолжение темы о округлениях.
Я тут узнал, что оказывается в современных процессорах Intel, поддерживающих расширенный набор системы команд SSE4.1 есть команда округления ROUND{PS, PD}. Наверняка и у AMD что-то подобное есть.

https://ru.wikipedia.org/wiki/SSE4#SSE4a

http://o-ili-v.ru/wiki/SSE4

Это что же получается - компилятор MQL5 не использует данную команду на уровне процессора? Т.к. мой процессор Intel Kaby Lake поддерживает этот набор.

А там много еще чего есть, даже скалярное умножение векторов. 

SSE4 — Википедия
  • ru.wikipedia.org
SSE4 — новый набор команд микроархитектуры Intel Core, впервые реализованный в процессорах серии Penryn (не следует путать с SSE4A от AMD)[1]. Он был анонсирован 27 сентября 2006 года, однако детальное описание стало доступно только весной 2007 года. Более подробное описание новых возможностей процессоров для программистов можно найти на сайте...
Причина обращения: