¿Cómo agrego una gran cantidad de contenido rico (imágenes, formato) rápidamente a un control sin usar toneladas de CPU?

StackOverflow https://stackoverflow.com/questions/148881

  •  02-07-2019
  •  | 
  •  

Pregunta

Estoy usando wxWidgets y Visual C ++ para crear una funcionalidad similar a la de usar Unix " tail -f " con formato enriquecido (colores, fuentes, imágenes) en una GUI. Me dirijo a wxMSW y wxMAC.

La respuesta obvia es usar wxTextCtrl con wxTE_RICH, usando llamadas a wxTextCtrl :: SetDefaultStyle () y wxTextCtrl :: WriteText ().

Sin embargo, en mi estación de trabajo de 3ghz, compilada en modo de lanzamiento, no puedo seguir siguiendo un registro que crece en promedio de 1 ms por línea, y finalmente se queda atrás. Para cada línea, incurro en:

  1. Dos llamadas a SetDefaultStyle ()
  2. Dos llamadas dos WriteText ()
  3. Una llamada a Freeze () y Thaw () the widget

Cuando ejecuto esto, mi CPU va al 100% en un núcleo usando wxMSW después de llenar aproximadamente 20,000 líneas. El programa es visiblemente más lento una vez que alcanza un cierto umbral, quedando más atrás.

Estoy abierto a usar otros controles (wxListCtrl, wxRichTextCtrl, etc.).

¿Fue útil?

Solución 3

Derive de wxVListBox. De los documentos:

  

wxVListBox es un control similar a un cuadro de lista con las siguientes dos diferencias principales de un cuadro de lista regular: puede tener un número arbitrariamente grande de elementos porque no los almacena solo, sino que utiliza la devolución de llamada OnDrawItem () para dibujarlos (por lo que es un cuadro de lista virtual) y sus elementos pueden tener una altura variable según lo determinado por OnMeasureItem () (por lo que también es un cuadro de lista con las líneas de altura variable).

Otros consejos

¿Ha considerado limitar la cantidad de líneas en la vista? Cuando tuvimos un problema similar, nos aseguramos de que nunca más de 10,000 líneas estén en la vista. Si entran más líneas en la parte inferior, eliminamos las líneas en la parte superior. Esto no estaba usando WxWidgets, estaba usando una interfaz de usuario de Cocoa nativa en Mac, pero el problema es el mismo. Si una vista de texto con estilo (con colores, formato e impresión bonita) crece demasiado, agregar más datos en la parte inferior se vuelve bastante lento.

Parece que el control que está utilizando simplemente no está creado para la cantidad de datos que está arrojando. Consideraría construir un control personalizado. Aquí hay algunas cosas que podría tener en cuenta:

  1. Cuando entra una nueva línea, no necesita volver a representar las líneas anteriores ... no cambian y el diseño no cambiará debido a los nuevos datos.
  2. Intente mantener solo la parte visible más algunas pantallas de retrospectiva en la memoria a la vez. Esto lo haría un poco más ligero ... pero tendrá que hacer su propia gestión de desplazamiento si desea que el usuario pueda retroceder más allá de su look-back y hacer que todo parezca sin problemas.
  3. No necesariamente actualice una línea a la vez. Cuando haya nuevos datos, cójalos todos y actualícelos. Si obtiene 10 líneas muy rápido y actualiza la pantalla de una sola vez, puede ahorrar parte de la sobrecarga de hacerlo línea por línea.

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top