visual - textbox placeholder c# windows form
La API más rápida para renderizar texto en formularios Windows Forms? (5)
Necesitamos optimizar el procesamiento de texto para una aplicación C # Windows Forms que muestra una gran cantidad de cadenas pequeñas en una grilla irregular. En cualquier momento, puede haber más de 5000 células visibles que se actualizan 4 veces por segundo. La familia de fuentes y el tamaño son consistentes en todas las celdas, aunque el color puede variar de una celda a otra, al igual que en negrita / cursiva / simple.
He visto información conflictiva en la web sobre TextRenderer.DrawText
vs. Graphics.DrawString
siendo la más rápida / mejor, que se reduce a una comparación GDI vs. GDI + en el nivel Win32 .
También he visto resultados radicalmente diferentes en Windows XP vs. Windows Vista, pero mi objetivo principal es Windows XP. Los artículos que prometen grandes avances con WinFX y DirectX 10 no son útiles aquí :-)
¿Cuál es el mejor enfoque aquí? No tengo miedo de introducir una pequeña capa de C ++ / CLI y optimizar el manejo del contexto del dispositivo para obtener más rendimiento, pero me gustaría obtener un consejo definitivo sobre qué dirección tomar.
EDITAR: Gracias por las respuestas iniciales. Intentaré una combinación de renderizado de mapa de bits de fondo y apego a las llamadas equivalentes de GDI.
Crear una clase de interoperabilidad de C ++ / CLI para hacer el dibujo en código nativo resultará en un dibujo increíblemente rápido. Hemos sido testigos de esto y lo hemos medido.
Si no puede hacer eso, hemos encontrado gráficos. DrawString es ligeramente más rápido que TextRenderer.DrawText.
En mi sistema Windows 7 64 Bit ¡TextOut es incluso un poco más lento que DrawString! TextRenderer.DrawText es mucho más lento que DrawString.
GDI es más rápido dibujando en general que GDI +. Trabajé en un proyecto que tenía que dibujar miles de líneas y cadenas de texto y cambiar de GDI + a GDI hizo una mejora significativa en el rendimiento. Eso fue usando Windows XP, así que no puedo comentar sobre Vista. También recomendaría usar doble buffering para que tu dibujo también mejore el rendimiento. Cree un mapa de bits compatible fuera de pantalla y vuelva a utilizarlo cada vez que necesite dibujar.
La reproducción de texto de 5000 o más es lenta incluso con GDI, especialmente si necesita desplazamiento. Cree un subproceso de representación por separado y notifique el subproceso de interfaz de usuario cada 200 ms y bitblt los resultados actuales. Da una experiencia de usuario sin problemas.
Un desarrollador de Microsoft ha publicado un artículo de GDI frente a GDI + Text Rendering Performance en su blog que responde a la pregunta de la velocidad bruta: en su sistema, GDI DrawText era aproximadamente 6 veces más rápido que GDI + DrawString.
Si necesitas ser un verdadero demonio de la velocidad, TextOut es más rápido que DrawText, pero tendrás que encargarse de los recortes y del ajuste de palabras. ExtTextOut admite recorte.
El renderizado GDI (TextRenderer) será más consistente con otras partes de Windows usando GDI; GDI + intenta ser independiente del dispositivo, por lo que algunos espacios y entalladuras son inconsistentes . Consulte la herramienta Configuración de área de superficie de SQL Server 2005 para ver un ejemplo de representación incoherente.