Обсуждение статьи "Графические интерфейсы X: Элемент "Стандартный график" (build 4)" - страница 3

 
Anatoli Kazharski:

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

Сейчас это не потребляет много ресурсов (теперь и в Windows 10 тоже). Вы статью читали (и комментарии тоже) ?

//--- 

P.S. Кстати, потребление ресурсов процессора в разных терминалах (MT4/MT5) и версиях ОС (Windows) сильно отличается при равных условиях. В Windows 7 терминал MetaTrader 4 показывал себя существенно лучше, чем MetaTrader 5. К сожалению не смогу сейчас привести цифры, так как уже полностью перешёл на Windows 10

Что касается оптимизации, то я ещё не все варианты исчерпал. Ещё есть что оптимизировать и есть понимание как.

Для реализации ускоренной прокрутки чего либо, и для плавного изменения цвета объекта под курсором, таймер необходим. Здесь все правильно.

Однако это не может вызвать расход ресурсов до 10 процентов в состоянии покоя. Значит проблема в другом. В чем?

Возможно проблема в вызове функции CheckElementsEventsTimer(), каждые 16 мс?

То есть, на каждом событии таймера, Вы проверяете события всех элементов интерфейса? Зачем?

Что в этой проверке такого, что может нагружать процессор?

 

Для примера, обычное перемещение курсора мыши в области чистого графика, когда на нём вообще ничего нет (графических объектов и MQL-приложений) уже поднимает потребление процессора до 6-7%:

До начала теста:


Во время теста:

 
Реter Konow:

Для реализации ускоренной прокрутки чего либо, и для плавного изменения цвета объекта под курсором, таймер необходим. Здесь все правильно.

Однако это не может вызвать расход ресурсов до 10 процентов в состоянии покоя. Значит проблема в другом. В чем?

То есть, на каждом событии таймера, Вы проверяете события всех элементов интерфейса? Зачем?

Сейчас это реализовано так, что только в момент перемещения курсора. При этом такое только в Windows 10. В Windows 7 такого не было.

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

Есть ещё некоторые варианты, но их ещё нужно протестировать. Если будет выигрыш, то в одной из следующих статей он будет представлен.

 
Anatoli Kazharski:

Для примера, обычное перемещение курсора мыши в области чистого графика, когда на нём вообще ничего нет (графических объектов и MQL-приложений) уже поднимает потребление процессора до 6-7%:

До начала теста:


Во время теста:

К сожалению, этот факт оптимизации не поддается.

Однако, проверка состояний элементов управления на событиях таймера (по-моему, слишком частой. Вместо 16 мс. можно поставить 25 мс. ) никак не должна повышать потребления ресурсов, если во время этой проверки не осуществляется какое-либо ресурсо-затратное действие.

 
Реter Konow:

...

Что в этой проверке такого, что может нагружать процессор?

...

Однако, проверка состояний элементов управления на событиях таймера (по-моему, слишком частой. Вместо 16 мс. можно поставить 25 мс. ) никак не должна повышать потребления ресурсов,

если во время этой проверки не осуществляется какое-либо ресурсо-затратное действие. 

Перерисовка графика для отображения изменений.
 
Anatoli Kazharski:

Сейчас это реализовано так, что только в момент перемещения курсора. При этом такое только в Windows 10. В Windows 7 такого не было.

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

Есть ещё некоторые варианты, но их ещё нужно протестировать. Если будет выигрыш, то в одной из следующих статей он будет представлен.

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

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

 

Реter Konow: 

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

Поэтому и смысла в этом нет. Задача ведь не в том, чтобы увеличить, хоть и несущественно, нагрузку на процессор, а наоборот, уменьшить её. Получается, что не ошибаюсь. )

 
Anatoli Kazharski:
Перерисовка графика для отображения изменений.

Зачем делать перерисовку всего графика, когда изменения могут осуществляться точечно, по отношению к конкретному элементу?

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

 
Реter Konow:

Зачем делать перерисовку всего графика, когда изменения могут осуществляться точечно, по отношению к конкретному элементу? 

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

Реter Konow:

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

Сейчас вообще ничего не перерисовывается каждые 16 мс в состоянии покоя. Пользователь ведь не будет нарезать круги курсором мыши по графику без остановок. В текущей реализации потребление ресурсов процессора не превышает 6-7%. 

 
Anatoli Kazharski:

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


 Очень, очень странно. В своей реализации интерфейса у меня нет ни одного вызова функции ChartRedraw()

До сих пор я толком не знал зачем она нужна... С канвасом (объектами битмап) я работаю без нее.

Допустим функция ChartRedraw() необходима, - тогда получается каждое изменение, каждого объекта требует полной перерисовки всех объектов?