Lienzo vs. Etiquetas - página 6

 

¿Por qué querría probar los dibujos gráficos en un probador de estrategias (especialmente en una versión especializada de visual pending), cuando es mejor hacerlo directamente en un gráfico de trabajo?

Y enhorabuena a los que no se les ocurre desactivar el trazado gráfico en sus robots en el probador no visual.

 

Nikolay tiene razón: la edición de las propiedades de las etiquetas no tiene nada que ver con la representación de las mismas.

La etiqueta, como cualquier otro objeto del gráfico, se dibuja en un hilo completamente diferente e independiente del trabajo del programa MQL5. El robot sólo puede pedir que el gráfico se vuelva a renderizar a la fuerza, pero no puede medir el tiempo de renderización. El dibujo de gráficos con objetos es completamente asíncrono.

Pero el renderizado del lienzo es fácil de medir ya que se hace directamente en el flujo del robot y luego durante el renderizado independiente del gráfico queda por hacer un BitBlit nativo del mapa de bits listo en el contexto de la ventana. Esta operación es elemental y está bien acelerada por la tarjeta de vídeo.

En las etiquetas de texto SetFont/TextOut en las fuentes TTF es bastante caro.
 
Mihail Matkovskij:

Resulta que son 321 veces, si hay que creer esta medición.

Esta cifra demuestra que no se puede confiar en esta medida.
Esto es obvio para un programador experimentado.
¿De verdad crees que hay otra forma de mostrar los caracteres en una pantalla gráfica que no sea su formación píxel a píxel? Los días del ECock ya han pasado.
 
Renat Fatkhullin:

¿Por qué querría probar el trazado de gráficos en un probador de estrategias (especialmente en una versión especializada de visual pending), cuando es mejor probarlo directamente en un gráfico de trabajo?

Al mismo tiempo, felicitaciones a los que no han pensado en desactivar el trazado gráfico en sus robots de trading en el probador no visual.

También podría haberlo comprobado en el gráfico. Sin embargo, pensé que sería más fácil hacerlo en el Probador de Estrategias. Además, tuve una situación, que describí anteriormente, cuando la pantalla se basó en CCanvas y ralentizó seriamente el Asesor Experto en el probador. Sobre todo aparecía en las garrapatas. Para demostrarlo en el gráfico, habría que hacer una salida de texto en bucle. Es decir, hacer una gran tasa de refresco, como se hace en mi Expert Advisor con optimización offline en el que estoy trabajando ahora. Y decidí hacer un despliegue basado en etiquetas para ello, ya que Canvas lo habría ralentizado. Porque, como has apuntado, la etiqueta se renderiza en un hilo diferente, por lo que, no ralentizará la optimización autónoma del EA, que tengo funcionando en bucle.

Resulta que, como has dicho, se tarda más en dibujar el texto de las etiquetas que en dibujar OBJ_BITMAP_LABEL. Por lo tanto, para hacerlo más rápido, también necesita ser renderizado en un hilo separado. ¿Pero cómo? Si esto no se puede hacer, entonces desde el punto de vista deuna aplicaciónque utilizaOBJ_LABEL, es más rápido que OBJ_BITMAP_LABEL...

 
Nikolai Semko:
Esto es obvio para un programador experimentado.

¡Es obvio para un programador experimentado que haya estudiado en detalle o conozca a fondo el terminal! Y como no soy desarrollador del terminal, sino que sólo escribo aplicaciones para él, puede que no sepa, como la mayoría de los programadores, lo que no está en la documentación de MQL.

 
Mihail Matkovskij:

¡Esto es obvio para un programador experimentado que haya estudiado en detalle o conozca a fondo el funcionamiento de la terminal! Y como no soy desarrollador del terminal, sino que sólo escribo aplicaciones para él, puede que no sepa, como la mayoría de los programadores, lo que no está en la documentación de MQL.

Y, sin embargo, estás tratando de discutir no sólo con un desarrollador, sino con el director de MQ.

 
Alexey Viktorov:

Y, sin embargo, estás tratando de discutir no sólo con un desarrollador, sino con el director de MQ.

No estoy tratando de discutir, sino de averiguar si OBJ_BITMAP_LABEL puede ser menos costoso que OBJ_LABEL desde el punto de vista de la aplicación que lo utiliza.

 
Mihail Matkovskij:

Y decidí hacer una pantalla basada en etiquetas para ello, ya que Kanvas habría ralentizado las cosas.

Estoy bastante seguro de por qué tu lienzo se ralentizaba.
Porque intentabas meter varios fotogramas en uno de 30 milisegundos.
La cosa es que los cuadros no se redibujan (ChartRedraw) más a menudo que unos 30 cuadros por segundo de todos modos.

Como dije aquí, la diferencia entre kanvas text y Label es que el llenado de la matriz de píxeles en el caso de las etiquetas es asíncrono y no controlado por ti, por lo que el llenado de la matriz de píxeles en el caso de las etiquetas no ocurre más que una vez cada unos 30 milisegundos.
Pero puede ocurrir con el canvas porque no es asíncrono (relleno de mapa de bits). Puede rellenar el mapa de bits diez veces en 30 milisegundos, pero sólo se mostrará una vez, y 9 veces estará inactivo.
Por lo tanto, tal y como se comenta en¡La lona mola!, el programador necesita controlar la hora de inicio del BitMap.
Un modelo de comportamiento podría ser:

  • hay una función que forma el mapa de bits
  • la entrada de esta función almacena la hora de inicio en una variable estática en milisegundos.
  • La próxima vez que entres en esta función deberás comprobar si han pasado menos de 30 milisegundos desde la última generación del mapa de bits. Si la respuesta es afirmativa, entonces sale y devuelve false, si es negativa - comienza a rellenar y da salida a un nuevo Bitmap.
Es más conveniente, por supuesto, introducir la variable bool en la clase, que permite o no la formación del lienzo.
 
Nikolai Semko:

Estoy bastante seguro de por qué tu kanvas se ralentizaba.
Porque intentabas meter varios fotogramas en uno de 30 milisegundos.
La cosa es que los cuadros no se redibujan (ChartRedraw) más a menudo que unos 30 cuadros por segundo de todos modos.

Como dije aquí, la diferencia entre kanvas text y Label es que el llenado de la matriz de píxeles en el caso de las etiquetas es asíncrono y no controlado por ti, por lo que el llenado de la matriz de píxeles en el caso de las etiquetas no ocurre más que una vez cada unos 30 milisegundos.
Pero puede ocurrir con el canvas porque no es asíncrono (relleno de mapa de bits). Puede rellenar el mapa de bits diez veces en 30 milisegundos, pero sólo se mostrará una vez, y 9 veces estará inactivo.
Por lo tanto, tal y como se comenta en¡La lona mola!, el programador necesita controlar el tiempo de llenado del BitMap.
Un modelo de comportamiento podría ser el siguiente:

  • hay una función que forma el mapa de bits
  • la entrada de esta función almacena la hora de inicio de la generación de la imagen en una variable estática en milisegundos.
  • La próxima vez que entres en esta función deberás comprobar si han pasado menos de 30 milisegundos desde la última generación del mapa de bits. Si la respuesta es afirmativa, entonces sale y devuelve false, si es negativa - procede a rellenar y dar salida a un nuevo Bitmap.
Sería mejor, quizás, introducir una variable en una clase que permita crear un lienzo.

¿Hay alguna información disponible en algún lugar donde se pueda leer más al respecto? ¡Aunque todo está claro para mí, pero aún así, el tema es bastante interesante! Ahora queda hacer la variante de control de actualización del mapa de bits y probarla. Me sorprenderá que el mapa de bits resulte más rápido que las etiquetas.

 

Aquí hay un ejemplo, que muestra lo que estoy hablando. La base de la secuencia de comandos se toma de la documentación aquí .
Comienza con una matriz aleatoria que produce 100 veces 100 líneas y genera 100 etiquetas.
Se emiten los 100 primeros fotogramas con etiqueta.
Después de eso, saldrán 100 cuadros con cadenas de lienzo.
El lienzo es el mismo.
En un bucle El sueño está documentado. Si el bucle contiene Sleep(0), la situación será muy diferente. Puedes experimentar un poco.
Todos los cuadros y líneas están numerados para su control.
He grabado un vídeo y lo he ralentizado 30 veces. Se puede ver, que sólo dos fotogramas de los 100 fueron realmente renderizados para las etiquetas, además, en el segundo fotograma se puede ver que las etiquetas son de diferentes fotogramas, es decir, se puede ver el funcionamiento de la asincronía.

por lo que estos valores de la Etiqueta son falsos:

Kanvas produce unos 60-70 cuadros de cada 100. Esto sucedió porque la trama se forma un poco más rápido que 30 milisegundos y por lo tanto no todos los marcos tienen tiempo para salir, aunque todos los marcos se forman.
Experimenta con los dos primeros parámetros

y el retardo del ciclo.


Si se aumenta el número de líneas a emitir, puede aparecer el error 4001. Se trata de un error en MQ cuando hay demasiadas salidas.

Archivos adjuntos: