Galería de interfaces de usuario escritas en MQL - página 57

 

@Nikolai Semko

Nikolai, ahora llegó inesperadamente la respuesta a la pregunta de"por qué se tarda tanto en dibujar un lienzo".

Las ventanas constan de dos lienzos! Estos lienzos son casi iguales en tamaño. Así que el área de dibujo debe multiplicarse por dos. Pero eso es sólo el principio.

En el espacio de la ventana hay grandes elementos de desplazamiento (V_BOX), que también se dibujan completamente llenos del color original. Es decir, si V_BOX ocupa la parte principal de la ventana, el área de dibujo debería multiplicarse por tres. Pero! tiene un lienzo adicional. La imagen se desplaza sobre ese lienzo. La base del elemento es sólo una barra de desplazamiento. En resumen - el área de dibujo debería multiplicarse por cuatro (especialmente si la barra de desplazamiento es larga). Y sólo entonces, los elementos se dibujan.

Parecería que es todo... Podemos poner un punto.Multiplicamos el área de la ventana por tres o cuatro. Pero ¡no!

Lospropios elementos también tienen varias capas. Cada uno tiene una base. La base se dibuja siempre desde cero, rellenada con el color original. Después se dibujan los marcos sobre la base. A continuación, los iconos se dibujan encima de las partes ya dibujadas del elemento. Y por último, los textos se dibujan encima de todo.

Como resultado, el usuario sólo ve el color final en cada píxel concreto. Pero en el lugar de este píxel los colores cambian varias veces a medida que se dibuja toda la ventana.


Ahora multiplique esto por 15 ventanas.... Queda claro que no hay ningún fallo especial en el código - he medido especialmente la velocidad de ejecución de partes del bloque de dibujo, y 50 ms para una pantalla completa también me funciona. Es sólo que termino con muchas más pantallas.


Tengo una idea de cómo cambiar el código y acelerar el dibujo en 2 o 3 veces. Pero lo haré después del trabajo principal.

Quiero darte las gracias por insistir en revisar el código. Tenías razón. Ese es el caso cuando la crítica fue útil.

También, gracias a @AndreyBarinov por la pista con el texto. Quizá se me ocurra algo.

Nikolai Semko - BeeXXI Corporation
Nikolai Semko - BeeXXI Corporation
  • 2024.07.15
  • www.mql5.com
Профиль трейдера
 
Реter Konow #:

@Nikolai Semko

...y 50ms a pantalla completa también me funciona. ....

La prueba es aproximada. Medí la velocidad de apertura de una ventana con tres lienzos de tamaño casi igual (ventana de iconos) y obtuve ~70 ms. Si se suma el área de todos los lienzos (sin elementos), a continuación, sólo sobre el área de la pantalla del portátil de 17 ". Esto no incluye el área de la base de los elementos y los propios iconos, que se dibujaron en la parte superior del lienzo. Así que sí, ~50ms para llenar de color el área de una pantalla completa teórica. Aún no lo he medido con exactitud. ¿Por qué, si el "elefante" está justo en medio de la habitación? :)

 
Hablaba de 50 ms como interfaz sobrecargada y no optimizada. 3-10 ms es normal

Sin embargo, haz algunos perfiles. Harás muchos descubrimientos en tu código.
 
Nikolai Semko #:
Hablaba de 50 ms como interfaz sobrecargada y no optimizada. 3-10 ms es normal

Sin embargo, haz algunos perfiles. Harás muchos descubrimientos en tu código.
Nikolai, estos son sólo números. Necesitas datos específicos. Tamaño de la pantalla, por lo menos. Entonces podrás hacer cálculos precisos.
 
Dibujar en el lienzo es una inicialización del array. Es fácil averiguar la velocidad máxima - la función con el bucle de llenado del array lo revelará. El tamaño del array debe corresponder a la suma de píxeles de la pantalla condicional.
 
Eres como Stirlitz que no quería ir al campo de patatas.
Haz el perfil...
 
Nikolai Semko #:
Eres como Stirlitz que no quería ir al campo de patatas.
Haz el perfil...
Lo hice. Te enviaré un gif.
 


Es necesario un estudio en profundidad de los ciclos dentro del bloque de dibujo. Un perfil superficial no da una imagen completa. Pero ya está claro de qué se trata. Escribí aquí

. Creo que no me equivoco.

(versión preliminar del bloque de dibujo, que utilizo para las pruebas)
 
Реter Konow #:

...

Tengo una idea de cómo cambiar el código y acelerar la representación de 2 o 3 veces. Pero lo haré después del trabajo principal ...

He analizado la complejidad de la tarea y el valor del resultado final.

Conclusión: no tiene sentido hacerlo.

No tiene sentido acelerar el primer dibujo. Un segundo y medio para construir 15 ventanas con gráficos complejos y barras de desplazamiento es un resultado normal. El primer dibujo puede ocultarse a los ojos del usuario realizándolo antes de abrir las ventanas. Visualmente, las ventanas aparecerán instantáneamente tras una pausa de medio segundo. Si, por supuesto, quiere que se abran 15 ventanas a la vez, lo cual es poco probable.

No tiene que dibujar la parte trasera de la ventana. Habrá una ganancia de ~20ms. Eso no suena impresionante.

La semana pasada se consiguió lo principal: utilizar imágenes guardadas en todos los eventos excepto en la primera compilación. Esta es una gran ganancia en la velocidad de la interfaz.

El resto de los lags tienen que ver con redibujar ventanas al cambiar de foco, o llamadas innecesarias. Son soluciones fáciles. No quiero que esta gran ganancia sea ignorada por el tiempo de carga, que no es tan importante. Sin embargo, he cambiado mi propio foco de atención. Debería tenerlo.

Aquí, cierro la cuestión de la velocidad de la primera renderización, por su irrelevancia e intrascendencia para el desarrollo actual.

Próxima actualización el domingo. Desplegaré un motor con un mecanismo conceptualmente completo de interacción del software con el programa de usuario.
 
Реter Konow #:
Analicé la complejidad de la tarea y el valor del resultado final.

La conclusión fue que no tenía sentido.

Crear 15 ventanas con gráficos complejos y barras de desplazamiento en un segundo y medio es un resultado normal. Es posible dibujar el primer gráfico antes de abrir la ventana para que no lo vea el usuario. Visualmente, la ventana aparecerá inmediatamente después de una pausa de medio segundo. Por supuesto, si el usuario quiere tener 15 ventanas abiertas al mismo tiempo, esto es poco probable.

No es necesario dibujar la parte posterior de la ventana. Habrá una ganancia de ~20ms. Eso no suena increíble.

La semana pasada, logramos nuestro objetivo principal: usar imágenes guardadas para todos los eventos excepto la primera construcción. Esto supone una enorme aceleración para la interfaz.

El resto de los retrasos estaban relacionados con el redibujado de la ventana al cambiar el foco o con llamadas innecesarias. Esto es fácil de arreglar. No quiero ignorar esta gran mejora por los tiempos de carga, que no son tan importantes. Sin embargo, he cambiado mi enfoque. Debería tener

Aquí, he terminado con el primer tema de la velocidad de renderizado porque no es relevante o importante para el desarrollo actual.

La próxima actualización será el domingo. Presentaré un motor con un mecanismo conceptualmente completo de interacción entre el software y el programa de usuario.

Sí, lo más importante es sacar primero un software totalmente funcional.