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

 
hini #:
Можно ли рисовать определенные окна только тогда, когда они открыты? Редко бывает так, что одновременно открыты десятки окон. В этом нет необходимости.

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

 
Реter Konow #:
Возможно, есть способ ускорить рисование. Убрать нижнее основание платформ окон. Это большие канвасы за лицевой стороной где расположены элементы. Если их убрать - будет раза в 2 быстрее. Надо подумать.

Вот о каком канвасе я говорю:

1. Лицевая сторона на которой расположены элементы:


2. Тыловая сторона на которой расположены кнопки явления окна (крестик, минимизатор), иконка и текст с именем. Однако, все окно закрашено в зеленый цвет и на это было потрачено время. Но, пользователь видит только рамки и шапку окна. Получается в этом месте рисование происходит напрасно:


 
Думаю, если не рисовать невидимую часть тыловой стороны можно ускорить первую отрисовку окна минимум на треть.  Точно пока не скажу, нужно проверить.  Пусть рисует только рамку и шапку. Остальное пропускать. В любом случае будет выйгрыш.
 
Andrey Barinov #:

У меня тоже канвас на полный экран перерисовывается полностью при каждом изменении, но это занимает не дольше 50 мс...

Самое затратное это текст рисовать. Поэтому, чтобы не юзать TextOut каждый раз, то я их храню в массивах. Получается значительно быстрее.

Да, TextOut используется. Подумаю что можно с этим сделать.

 
В общем, к следующему релизу проведу очередной рефакторинг блока рисования и добьюсь увеличения скорости.  Но главное - закончу движок.
 
Реter Konow #:

Ну, здесь работает простая арифметика: сумма площадей 10 - 17 окон гораздо больше полного экрана. Согласитесь. Плюс вторичные дорисовки необходимые для создания теней, иконок, рамок... 

А насчет  TextOut проверю и напишу. Интересная мысль. 

что-то я не понимаю Вашей простой арифметики :). В моей арифметике нет необходимости отрисовывать те пиксели, которые не видны пользователю, и максимальный размер канваса для отрисовки ограничен размером дисплея в пикселях.

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

 

Нужно утвердить план дальнейшей работы.

 Обновления буду выпускать каждую неделю. В субботу или воскресенье.

1. В следующем релизе выпущу полную версию движка. Исправлю баги и ускорю отрисовку.

2. Второй релиз будет посвящен таблицам. Восстановлю основные возможности.

3. Третий релиз - сделаю динамичные таблицы. Надеюсь успею их реализовать за неделю. Попробую.

4. Четвертый релиз - динамичное окно. Постараюсь выставить законченную версию.


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

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

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


В этой ветке продолжу постить коды, картинки и пояснительные материалы по мере возможностей. Буду очень занят выполнением вышеупомянутой работы

 
Нет Перт, все равно too much. На твой интерфейс со всем текстом, тенями и т.д. максимум 50 мс на слабеньком процессоре. 
Ищи косяк.
Запусти профилирование. Посмотри какие функции отжирают 95% времени.
Может быть используешь ChartGet или XY функции(хотя у тебя же нет привязки к графику)
Короче запускай профилирование. Делов то на 40 секунд.
 
Ветви шаблонанаписаны в коде KIB, который
Не должны смешиваться с кодом сборщика. Он должен быть выпущен как отдельный проект.
 
Andrey Barinov #:

что-то я не понимаю Вашей простой арифметики :). В моей арифметике нет необходимости отрисовывать те пиксели, которые не видны пользователю, и максимальный размер канваса для отрисовки ограничен размером дисплея в пикселях.

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

Работа с одним большим канвасом имеет массу ограничений. Я уже думал над таким вариантом и даже обсуждал с Николаем.

Поясню: Вы это делаете потому что используете штатный класс Ccanvas. Там готовые решения в рамках которых Вы работаете. Но я не использую класс Ccanvas. Все коды отрисовки - личная разработка. Поэтому не придерживаюсь концепции - один канвас для ВСЕГО. На мой взгляд, это технически неудобное и малоэффективное решение в условиях графика. Проще использовать наборы объектов битмап и к ним цеплять готовые ресурсы, чем иметь один битмап и программно выстраивать взаимодействие изображений на нем. Даже представить сложно. Но это не главное.

Представьте насколько труднее реализовать концепцию многооконного графического интерфейса, если у Вас только ОДИН канвас. Я бы за такое не взялся. 

Но даже это не является решающим. Главная причина отказа от идеи одного канваса для всех изображений: когда есть только один канвас, перемещение окон интерфейса требует перерисовки внутри среды MQL. В противовес этому, если каждое окно занимает свой объект битмап и двигается функцией ObjectSetInteger(), - перерисовка перемещаемых объектов ложится на штатные функции которые работают вне среды MQL. Поэтому это намного быстрее. 

Просто у Вас несколько другое направление разработки в котором эффективнее работают другие решения. 


За наводку на  TextOut большое спасибо. Исследую этот момент.