Propuse que JMP maneje los elementos de visualización de la misma manera que cualquier otro marco GUI: no vuelva a dibujar ningún elemento a menos que el contenido haya cambiado o se invoque un método de redibujado (o invalidación) específico.
Específicamente, ¿ puede haber una manera de evitar que los cuadros de cuadros vuelvan a dibujar el contenido (esto incluye volver a dibujar todos los puntos de datos y volver a ejecutar cualquier secuencia de comandos adjunta) cada vez que se desplaza una ventana? En serio, dibuje una vez y mantenga el mapa de bits (o mapa de píxeles) persistente a menos que se haya cambiado el cuadro (cambio de tamaño/cambio dt RowState/método inval)
Esta es una pérdida de productividad increíblemente extrema al desplazarse por gráficos que tienen miles de puntos o secuencias de comandos complejas adjuntas. El método actual de "volver a dibujar en cada oportunidad posible, pase lo que pase" es extremadamente desconcertante.
Aquí hay un ejemplo: el script adjunto simplemente se imprime en el registro, pero al desplazarse por los gráficos se muestra cómo se ejecuta constantemente cada vez que se actualiza el cuadro de desplazamiento (no propague el <
New Window( "Test",
vlb = V List Box()
);
::global function = Function( {},
Print( 1 );
);
For( i = 1, i <= 20, i++,
vlb << Append(
Graph Box(
Frame Size( 200, 200 ),
X Scale( -100, 100 ),
Y Scale( -100, 100 ),
::global function
)
)
)¡Gracias por la respuesta!(perdón por la respuesta de largo aliento aquí)
En mi grupo estamos buscando defectos en las obleas; a menudo escaneamos FOUP completos durante excursiones que consisten en 25 obleas.Debido a que se trata de excursiones, a menudo hay decenas o cientos de miles de defectos por oblea.Parte de nuestro flujo de trabajo es comprobar estas obleas.
Creé una secuencia de comandos que solo realiza algunas personalizaciones en la trama; es decir, dibujo el dado debajo de los puntos defectuosos usando el comando Path() (usando una cadena SVG), luego dibujo los defectos no clasificados y luego agrego un marcador seg con los defectos clasificados en último lugar (para asegurar que los defectos clasificados no sean oscurecidos por los defectos no clasificados).
El renderizado inicial de 25 obleas puede tardar varios segundos y, a menudo, podemos verlos todos a la vez (tamaño en pantalla relativamente pequeño por mapa de obleas), pero si los usuarios quieren mapas de obleas más grandes, tendrán que desplazarse por la lista.Desplazarse por los mapas de obleas debería ser suave como la mantequilla, ya que nada cambia, pero, por supuesto, toma varios segundos para cada actualización de cuadro.
Mi solución ha sido crear una imagen después de dibujar el mapa de oblea y solo mostrar la imagen, pero esto genera una gran sobrecarga para garantizar que se vuelva a dibujar la imagen si cambia el estado de la tabla o cualquier otra cosa.Además, este método tarda aproximadamente 3 veces más en procesarse inicialmente que no usarlo.
Creé api de GUI en mi trabajo anterior y el valor predeterminado siempre fue una evaluación perezosa; es cierto que nunca tuve que usar ningún formato de imagen más grande que un JPEG estándar (2 ^ 16 píxeles por lado), pero manejaría rutinariamente este tamaño máximo JPEG sin problemas y solo usa unos pocos MB de RAM.
Lo que creo que sería ideal es poder dar a FrameBox algún tipo de mensaje para garantizar una evaluación perezosa del mapa de bits para el motor de visualización, y luego se dejaría cualquier problema de RAM que pudiera existir debido a mapas de bits enormes (o mapas de píxeles). a criterio del usuario.
Aquí hay un buen ejemplo del problema con el que estoy lidiando: (tenga en cuenta que uso este método < dolorosamente lento , y es solo un GraphBox.¡Imagina hacer esto con 10 - 20 de ellos mostrando!
Estoy usando una computadora de escritorio bastante decente con 64G de ram y una buena CPU de 4 núcleos.Este es JMP16 con procesamiento de hardware (JMP14 también tiene el mismo problema) y estoy usando un monitor 4k, pero los usuarios con monitores HD estándar tienen los mismos problemas.
Names Default to Here( 1 );
table = New Table( "test table",
Add Rows( 150000 ),
<<NEW column=""></NEW>
Para resumir:
- ¿Puede proporcionar un método para la evaluación diferida del mapa de bits del Administrador de visualización?Ya sabe cuándo cambia un RowState y ya proporciona un método <
- ¿Puede proporcionar un método para deshabilitar cualquier intento de texto flotante?Esto consume muchos ciclos y también es completamente inútil en esta situación (o incluso un poco dañino ya que dibuja un cuadro sobre los puntos)
Y, debido a que he estado frustrado con estos otros problemas menores durante mucho tiempo, permítanme presentar algunas otras solicitudes (ofc, de ninguna manera espero que trabajen en estos problemas, sería genial si lo hiciste 
- En JMP12 se obedecía el orden de los objetos en el FrameBox -> Personalizar... (el menú contextual).Específicamente, al tener filas seleccionadas, esos puntos seleccionados podrían ser dibujados por cualquier script de gráficos agregado que se enumerara después de ellos en la lista.Comenzando con JMP14 (nunca usé JMP13, así que no puedo hablar por él), los puntos seleccionados se dibujan encima de todo lo demás.Esto es problemático cuando se trata de muchos miles de puntos y no se pueden mostrar líneas de tendencia ni ningún otro objeto sobre los puntos si están seleccionados.
- Esto realmente entra en juego cuando un usuario selecciona una categoría en la leyenda y los puntos se seleccionan; de repente, ¡el usuario no puede ver las líneas!
- vea a continuación un código que muestra esto
- Además, al dibujar una cuadrícula (hago esto para mostrar el troquel dentro de un mapa de oblea) en un GraphBox, la cuadrícula no está suavizada.Al copiar la imagen a un portapapeles, de nuevo la imagen no tiene suavizado.JMP12 haría el suavizado y las imágenes se verían mucho ¡mejor!
- vea a continuación una comparación de JMP12 y JMP14/16 anti-aliasing
Problema de ejemplo con puntos seleccionados por encima de todos los demás elementos posibles:
Names Default to Here( 1 );
table = New Table( "test table",
Add Rows( 150000 ),
<<NEW column=""></NEW>
imagen del problema:

La línea debe dibujarse encima de los puntos de datos.

JMP12 dibujaría en el orden correcto:

Ejemplos de Anti-Aliasing: (tenga en cuenta que estos son mapas de obleas falsos que demuestran mi punto)
JMP14/16: Imprimir pantalla:

JMP14/16 Copiar imagen:

Pantalla de impresión JMP12:

JMP12 Copiar imagen:

¡¡Gracias!!
Hola @ErraticAttack -
Gracias por la sugerencia: el rendimiento es definitivamente importante para JMP.Algunos informes pueden tener más de 100 000 píxeles de alto, por lo que JMP solo dibuja el contenido que está actualmente visible en un área de desplazamiento.En Windows, el desplazamiento está optimizado para valores de desplazamiento pequeños para copiar píxeles donde sea posible y solo volver a dibujar el contenido que es "nuevo".
¿Puede contarnos un poco más sobre su caso de uso?En particular:
- Mac o Windows
- ¿Su ventana consiste principalmente en plataformas o gráficos personalizados?
- ¿Su script de gráficos está dibujando mucho o se usa para otras tareas?
Si está dibujando una gran cantidad de geometría usando JSL, es posible acelerar las cosas usando Display Segs (Marker Seg, Line Seg) en lugar de JSL.