Галерея UI написанных на MQL - страница 57

 
Реter Konow #:

...

Есть идея как изменить код и ускорить отрисовку в 2- 3 раза. Но займусь этим после основной работы. ...

Проанализировал сложность задачи и ценность конечного результата. 

Вывод: нет смысла это делать.

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

Можно не рисовать заднюю сторону окна. Будет выйгрыш в ~20мс. Звучит не впечатляюще.

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

Остальные лаги имеют отношение к перерисовке окон при смене фокуса, или лишним вызовам. Легко исправить. Не хочу чтобы это основное достижение было проигнорировано из за времени загрузки, которая не так важна. Впрочем, я сам сместил акцент внимания. А зря.

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

Следующий обновление в воскресенье. Выкачу движок с концептуально завершенным механизмом программного взаимодействия с пользовательской программой.
 
Реter Konow #:
Я проанализировал сложность задачи и ценность конечного результата.

Пришел к выводу, что это бессмысленно.

Создание 15 окон со сложной графикой и полосами прокрутки за полторы секунды - это нормальный результат. Можно нарисовать первую графику до открытия окна, чтобы она не была видна пользователю. Визуально окно появится сразу после полусекундной паузы. Конечно, если пользователь хочет, чтобы одновременно было открыто 15 окон, это маловероятно.

Не обязательно рисовать заднюю часть окна. Выигрыш составит ~20 мс. Это не звучит удивительно.

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

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

На этом я закончил рассмотрение первого вопроса о скорости рендеринга, поскольку он не имеет отношения к текущей разработке.

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

Да, очень важно сначала выпустить полностью функциональное программное обеспечение.

 
hini #:

Да, очень важно сначала выпустить полноценную программу.

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

Приведу аналогию со строительством высотного дома. Представим проект, где прораб точно не знает, сколько этажей нужно построить. Допустим, ему не сообщили. Но в душе он творец - творческая личность. Ему все равно. Чем больше - тем лучше. Он любит высокие дома и небоскребы. Пока он работает, стройка идет, этажи прибавляются и дом растет до небес. Но квартиры невозможно передать жильцам, ведь строительные леса не убраны и жилплощадь не почищена. Даже двери не вставлены. Дом недоделан. Но для прораба это мелочи. Он смотрит ввысь. В небо. А жильцы ждут с нетерпением, им нужны квартиры. 

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

 Скажу так: этажи, пока, строится не будут. Вместо этого, будут заканчиваться те этажи которые уже построены. Работа будет запланирована таким образом, чтобы поскорее передать дом жильцам.

В конце концов, для них дом и строился...


 

Приветствую всех,

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

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

Я буду очень признателен, если вы рассмотрите это предложение.

 
Yutaka Okamoto #:

Приветствую всех,

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

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

Я буду очень признателен, если вы рассмотрите это предложение.

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

 

На сегодня у меня запланирован релиз.

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

Несколько слов об этом релизе:

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

Подробнее:

  • После проведения технических проверок и анализа результатов, было принято решение использовать вместо абстрактных глобальных свойств функции-обертки элементов. Как оказалось, это наиболее эффективный и простой вариант программного сцепления алгоритмов с графической средой.
  • В функции сохрания проекта и распечатки файлов UIDATA.mqh и API.mqh были внесены дополнения таким образом, что каждый интерактивный элемент интерфейса получает функцию-обертку автоматически при сохранении проекта. 
  • При этом, функции-обертки элементов получили очень маленькое тело и их главная задача вызывать центральную функцию, передавая три главных параметра - номер элемента, значение value и значение property.
  • Внешняя простота функций не мешает универсальности применения:  

            1. При вызове с пустыми скобками, функции возвращают значение параметра элемента одним из трех типов: int, double, string, в зависимости от типа элемента.

     int i    = w6_i_CHECKBOX_Some_checkbox(); //Элемент чекбокс. Буква i после префикса означает что тип возвращаемого/устанавливаемого значения int.
     
     double d = w6_d_S_EDIT_Spin_the_value();  //Элемент поле ввода с кнопками. Буква d после префикса означает что тип возвращаемого/устанавливаемого значения double.

     string s = w7_s_EDIT_Comment_1();         //Элемент текстовое поле ввода. Буква s означает что тип возвращаемого/устанавливаемого значения string.

           

            2. При вызове с одним значением в скобках, функции устанавливают передаваемое значение в параметер элемента и затем перерисовывают его (устанавливается значение int, double или string, в зависимости от типа элемента)     

     int i    = w6_i_CHECKBOX_Some_checkbox(0/1/2/3); //Элемент чекбокс. Передача нуля,единицы, двойки или тройки для смены между нейтральным, активированным, нетр.блокир. и актив. блокир. состояниями элемента. 
                                                      //Тот же метод работает для всех кнопок.
     
     double d = w6_d_S_EDIT_Spin_the_value(653.89);   //Элемент поле ввода с кнопками. Передача значения параметра в функцию для установки его в элемент.

     string s = w7_s_EDIT_Comment_1("Any text");      //Элемент текстовое поле ввода. Передача текста для установки в поле ввода.   


            3. При вызове со значением первого параметра по умолчанию и номером свойства (из доступных свойств), функции возвращают значение этого свойства элемента (все номера свойств имеют тип int, передаются в парамере property).

      int i = w6_i_BUTTON_Start(get_i,_A_COLOR); //Элемент Кнопка. Возврат значения цвета из свойства _A_COLOR. Может быть указано другое значение или другое свойство из списка доступных свойств.
                                                                  //Однако, данных тип функции принимает значения только типа int, но может приводить их к другим родственным типам (uint, short, bool...).
                                                                  //Значение первого параметра get_i говорит функции что не нужно принимать значение первого параметра в расчет, а лишь вернуть значение свойства _A_COLOR.


           4. При вызове со значением value и значением property в скобках, функции устанавливают передаваемые значения в доступные свойства элемента. Номер свойства передается в параметре property, значение свойства передается в параметре value. 

     int i = w6_i_BUTTON_Start(C'255,0,0',_A_COLOR); //Элемент Кнопка. Передача и установка польз. значения цвета в свойство _A_COLOR. Может быть указано другое значение или другое свойство из списка доступных свойств.
                                                                      //Однако, тип функции этого элемента принимает значения только типа int, но может приводить их к другим родственным типам (uint, short, bool...).

         


   Структура названий функций-оберток:  w6_i_BUTTON_Start();

1.    w - начальная буква всех функций-оберток. Сокращение от window

2.    6 (или другой номер) - порядковый номер окна содержащего элемент.

3.    i (либо d, либо s) - означает тип возвращаемого/устанавливаемого значения параметра элемента.

  • Может быть int:            для кнопок, чекбоксов, слайдеров, полей ввода с/без кнопок, прогресс-баров, диаграмм-баров, радио-кнопок.
  • Может быть double:     для слайдеров, полей ввода с/без кнопок.
  • Может быть string:      для текстовых полей ввода, для элементов VALUE, для ячеек таблицы, для вып.списков.


4.  BUTTON  -    название типа элемента которому принадлежит функция-обертка. Может быть любой другой элемент.

5.  Start     -  название конкретного элемента. 


  • Все функции-обертки имеют идентичную структуру названия.
  • Повторю: все функции печатаются автоматически.

//----------------------------------------------------------------------------------------------------

Умное применение системы интеллисенс:

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

Все функции обертки окон и элементов имеют вначале букву w. Однако, если после w поставить нижнюю черточку: _ откроется окно интеллисенс со списком названий всех функций окон пользовательского интерфейса. Далее, нужно найти в списке окно с искомым названием, посмотреть на его номер (он впечатан в название функции) и стерев черточку поставить этот номер после w. Сразу возникнет список интеллисенс с названиями функций элементов входящих в состав окна. Вот как это делается:

 

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

//----------------------------------------------------------------------------------------------------------

//----------------------------------------------------------------------------------------------------------

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

 switch(Element)
   {
//=====================================================================================================================
//WINDOW:       Settings example 1 | #: 6 | PFX: w_6 | GET/SET: int w_6_Settings_example_1(int value = get_i, int Property = 0)
//---------------------------------------------------------------------------------------------------------------------
//ELEMENT:      BUTTON
//NAME:         Start
//PARAMETER:    int
//INIT STATE:   OFF
//LOCATION:     Location: Window's Main Frame
//---------------------------------------------------------------------------------------------------------------------
//GET/SET:   int w6_i_BUTTON_Start(int value = none, int Property = 0)      | PFX: w6
//=====================================================================================================================
  
case Settings_example_1___Start:
  
               //------------------------------------------------------------------------------------------------------
               //What to do when button pressed or released?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case pressed:  Alert("BUTTON Start pressed!");   break;
  
                case released:  Alert("BUTTON Start released!");   break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
//=====================================================================================================================
//WINDOW:       Settings example 1 | #: 6 | PFX: w_6 | GET/SET: int w_6_Settings_example_1(int value = get_i, int Property = 0)
//---------------------------------------------------------------------------------------------------------------------
//ELEMENT:      CHECKBOX
//NAME:         Set an option
//PARAMETER:    int
//INIT STATE:   OFF
//LOCATION:     Location: Window's Main Frame
//---------------------------------------------------------------------------------------------------------------------
//GET/SET:   int w6_i_CHECKBOX_Set_an_option(int value = none, int Property = 0)      | PFX: w6
//=====================================================================================================================
  
case Settings_example_1___Set_an_option:
  
               //------------------------------------------------------------------------------------------------------
               //What to do when checkbox checked or unchecked?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case checked:  Alert("CHECKBOX Set_an_option pressed!");   break;
  
                case unchecked:  Alert("CHECKBOX Set_an_option released!");   break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
//=====================================================================================================================
//WINDOW:       Settings example 1 | #: 6 | PFX: w_6 | GET/SET: int w_6_Settings_example_1(int value = get_i, int Property = 0)
//---------------------------------------------------------------------------------------------------------------------
//ELEMENT:      CHECKBOX
//NAME:         Set another option
//PARAMETER:    int
//INIT STATE:   OFF
//LOCATION:     Location: Window's Main Frame
//---------------------------------------------------------------------------------------------------------------------
//GET/SET:   int w6_i_CHECKBOX_Set_another_option(int value = none, int Property = 0)      | PFX: w6
//=====================================================================================================================
  
case Settings_example_1___Set_another_option:
  
               //------------------------------------------------------------------------------------------------------
               //What to do when checkbox checked or unchecked?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case checked:  Alert("CHECKBOX Set_another_option pressed!");   break;
  
                case unchecked:  Alert("CHECKBOX Set_another_option released!");   break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
//=====================================================================================================================
//WINDOW:       Settings example 1 | #: 6 | PFX: w_6 | GET/SET: int w_6_Settings_example_1(int value = get_i, int Property = 0)
//---------------------------------------------------------------------------------------------------------------------
//ELEMENT:      D_LIST
//NAME:         D_LIST 1
//PARAMETER:    string
//INIT OPTION:  L_ITEM  1
//LOCATION:     Location: Window's Main Frame
//---------------------------------------------------------------------------------------------------------------------
//GET/SET:   string w6_s_D_LIST_D_LIST_1(string value = get_s, int Property = 0)      | PFX: w6
//=====================================================================================================================
 
Я надеюсь, что скоро попробую эти функции.
 
hini #:
Я надеюсь, что скоро попробую эти функции.
 Завтра вечером загружу новую версию в кодобазу. 
 
Релиз поздно вечером.