Discusión sobre el artículo "Interfaces gráficas X: Control "Gráfico estándar" (build 4)" - página 3

 
Anatoli Kazharski:

Se equivoca. Ya he respondido con suficiente detalle en los comentarios anteriores por qué se hizo así.

Ahora no consume muchos recursos (ahora también en Windows 10 ). Has leído el artículo (y los comentarios también) ?

//---

P.D. Por cierto, el consumo de recursos de CPU en diferentes terminales (MT4/MT5) y versiones de SO (Windows) es muy diferente en igualdad de condiciones. En Windows 7 el terminal MetaTrader 4 se mostró significativamente mejor que MetaTrader 5. Lamentablemente, ahora no puedo darte las cifras, pues ya he cambiado completamente a Windows 10.

En cuanto a la optimización, todavía no he agotado todas las opciones. Todavía hay algo que optimizar y entiendo cómo.

Para implementar el desplazamiento acelerado de algo y para cambiar suavemente el color de un objeto bajo el cursor, es necesario un temporizador. Aquí todo es correcto.

Pero no puede causar un consumo de recursos de hasta el 10% en el estado inactivo. Así que el problema está en otra parte. ¿Cuál es?

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

Es decir, ¿en cada evento del temporizador se comprueban los eventos de todos los elementos de la interfaz? ¿Por qué?

¿Qué hay en esta comprobación que pueda cargar el procesador?

 

Por ejemplo, mover el cursor del ratón en la zona de un gráfico limpio, cuando no hay nada en él (objetos gráficos y aplicaciones MQL) ya eleva el consumo de CPU hasta un 6-7%:

Antes de la prueba:


Durante la prueba:

 
Реter Konow:

Para implementar el desplazamiento acelerado de algo, y para cambiar suavemente el color del objeto bajo el cursor, es necesario un temporizador. Aquí todo es correcto.

Pero no puede causar un consumo de recursos de hasta el 10% en el estado inactivo. Así que el problema está en otra parte. ¿Cuál es?

Es decir, ¿en cada evento del temporizador se comprueban los eventos de todos los elementos de la interfaz? ¿Por qué?

Ahora se implementa para que sólo en el momento de mover el cursor. Y esto es sólo en Windows 10. En Windows 7 este no era el caso.

Y si se utiliza el método que ha sugerido, a continuación, los mismos gastos en la preparación de una matriz con los elementos sobre los que el cursor se encuentra ahora + algunos otros problemas salen. Ya he probado este método y renunció a ella, ya que no hay ganancia real allí.

Hay algunas otras opciones, pero todavía tienen que ser probados. Si hay una ganancia, se presentará en uno de los próximos artículos.

 
Anatoli Kazharski:

Por ejemplo, mover el cursor del ratón en la zona de un gráfico limpio, cuando no hay nada en él (objetos gráficos y aplicaciones MQL) ya eleva el consumo de CPU hasta un 6-7%:

Antes de la prueba:


Durante la prueba:

Desgraciadamente, este hecho no se puede optimizar.

Sin embargo, la comprobación de los estados de los elementos de control en eventos temporizados (en mi opinión, demasiado frecuentes. En lugar de 16 ms. se pueden poner 25 ms. ) no debería aumentar en absoluto el consumo de recursos, si durante esta comprobación no se realiza ninguna acción que consuma recursos.

 
Реter Konow:

...

¿Qué tiene esta prueba que puede poner a prueba el procesador?

...

Sin embargo, la comprobación de los estados de los elementos de control en los eventos del temporizador (creo que es demasiado frecuente. En lugar de 16 ms. se puede poner 25 ms. ) no debería aumentar el consumo de recursos de ninguna manera,

si durante esta comprobación no se realiza ninguna acción que consuma recursos.

Redibujando el gráfico para mostrar los cambios.
 
Anatoli Kazharski:

Ahora se implementa para que sólo en el momento de mover el cursor. Esto es sólo en Windows 10. En Windows 7, este no era el caso.

Y si se utiliza el método que ha sugerido, a continuación, los mismos gastos en la preparación de una matriz con los elementos sobre los que el cursor se encuentra ahora + algunos otros problemas salen. Ya he probado este método y renunció a ella, ya que no hay ganancia real allí.

Hay algunas otras opciones, pero todavía tienen que ser probados. Si hay una ganancia, se presentará en uno de los próximos artículos.

1. Y aquí, usted ya está equivocado. La preparación de la matriz de mapas con las coordenadas y tamaños de los elementos, así como el ajuste de sus valores en los eventos de mover las ventanas, no aumenta significativamente la carga en el procesador, porque el trabajo se realiza sólo en el evento de mover el cursor y sólo cuando se agarra el mango de la ventana. En caso de cualquier otro movimiento del cursor, la función de recálculo de coordenadas no será llamada.

2. Cuando simplemente se mueve el cursor, se llama a la función de localización, que recorrerá el mapa de elementos y encontrará el objeto bajo el cursor. Este proceso es puramente computacional y no carga el procesador.

 

Реter Konow: 

Preparar un array de mapas con las coordenadas y tamaños de los elementos, así como corregir sus valores en los eventos de movimiento de la ventana, no aumenta significativamente la carga del procesador, ya que el trabajo se realiza sólo en el evento de movimiento del cursor y sólo al coger el manejador de la ventana.

Por eso no tiene sentido. El objetivo no es aumentar la carga del procesador, aunque sea insignificante, sino al contrario, reducirla. Resulta que no me equivoco. )

 
Anatoli Kazharski:
Redibujar el gráfico para mostrar los cambios.

¿Por qué redibujar todo el gráfico cuando los cambios pueden hacerse punto por punto, en relación con un elemento específico?

Puede comprobar la necesidad de cambios cada 16ms, (la comprobación no carga), pero aplicar el cambio a cada objeto específico sólo cuando sea necesario y no redibujar todo el gráfico.

 
Реter Konow:

¿Por qué redibujar todo el gráfico cuando los cambios pueden hacerse punto por punto, en relación con un elemento específico?

Después de cada cambio en el gráfico, es necesario llamar a la función ChartRedraw() para obtener una visualización instantánea. Lo mismo ocurre al dibujar en el lienzo. Por lo tanto, los cambios se hacen primero en todos los elementos y sólo entonces, una vez, se redibuja el gráfico.

Etiqueta Konow:

Se puede comprobar la necesidad de cambios cada 16ms, (la comprobación no carga), pero aplicar el cambio a cada objeto específico sólo cuando sea necesario y no redibujar todo el gráfico.

Ahora mismo no se redibuja nada cada 16ms en reposo en absoluto. No es que el usuario vaya a estar cortando círculos con el cursor del ratón sobre el gráfico sin parar. En la implementación actual, el consumo de recursos de la CPU no supera el 6-7%.

 
Anatoli Kazharski:

Después de cada cambio en el gráfico, debe llamar a la función ChartRedraw() para una visualización instantánea. Lo mismo se aplica al dibujo en el lienzo. Por eso los cambios se hacen primero en todos los elementos y sólo entonces, una vez, se redibuja el gráfico.


Esto es muy, muy extraño. No tengo ni una sola llamada a la función ChartRedraw() en mi implementación de la interfaz.

Realmente no sabía por qué era necesaria hasta ahora..... Trabajo con canvas (objetos bitmap) sin ella.

Supongamos que la función ChartRedraw( ) es necesaria, - entonces resulta que cada cambio de cada objeto requiere redibujar completamente todos los objetos?