Me di cuenta en una aplicación MFC que estoy desarrollando que al arrastrar la barra de desplazamiento para deslizar hacia abajo el documento, la velocidad de fotogramas cae a niveles picos cuando hay un bloque que contiene aproximadamente un párrafo de texto pantalla, pero suave como la seda cuando está fuera de pantalla. Investigando el rendimiento, encontré la llamada única CDC::DrawText
para el párrafo de texto responsable. Esto se encuentra en una compilación de versión optimizada.Rendimiento bajo con DrawText en Win7 x64
que utilizan QueryPerformanceCounter
para obtener una medición de alta resolución de simplemente la llamada DrawText, así:
QueryPerformanceCounter(...);
pDC->DrawText(some_cstring, some_crect, DT_WORDBREAK);
QueryPerformanceCounter(...);
El texto es de relleno estilo Unicode, lorem-ipsum, 865 caracteres de longitud y se envuelve sobre 7 líneas de un bit dado el rectángulo y la fuente (interfaz de usuario de Segoe, lfHeight
= -12, un tamaño de texto de cuerpo estándar). A partir de mis mediciones, esa llamada sola toma un promedio de 7,5 ms, con un pico impar de 21 ms. (Nota para mantenerse al día con un monitor de 60 Hz se obtiene aproximadamente 16 ms para representar cada actualización.)
Traté de hacer algunos cambios para mejorar el rendimiento:
- Extracción de la
DT_WORDBREAK
mejora el rendimiento hasta alrededor de 1 ms (aproximadamente 7 veces más rápido), pero dado que solo una línea de texto está llegando a la pantalla, y había un poco más de 7 líneas con la palabra quebrada, esto parece sugerirme que el cuello de botella está en otra parte. - Estaba dibujando texto en modo transparente (
SetBkMode(TRANSPARENT)
). Así que probé el modo opaco con un relleno de fondo sólido. Sin mejora. - Pensé que el procesamiento de ClearType podría ser el culpable. Cambié la fuente
lfQuality
deCLEARTYPE_QUALITY
aNONANTIALIASED_QUALITY
. Parecía una porquería con bordes filosos y todo, y ninguna mejora. - Según una sugerencia de comentario, estaba usando un CMemDC, pero me deshice de él e hice el dibujo directo. Parpadeó como loco y sin mejoría.
Esto se ejecuta en una computadora portátil con Windows 7 de 64 bits con un Intel Core 2 Duo P8400 a 2.26 GHz y 4 GB de RAM - No creo que cuente como un sistema lento.
Llamo a DrawText() cada vez que dibuja y esto obviamente reduce el rendimiento con una función tan lenta, especialmente si varios de esos bloques de texto son visibles a la vez. Es suficiente para que la experiencia sea lenta. Sin embargo, Firefox puede renderizar una página como esta en ClearType con mucho más texto, y parece funcionar muy bien. ¿Qué estoy haciendo mal? ¿Cómo puedo evitar el bajo rendimiento de una llamada real de DrawText?
¿Qué sucede si cambia la aceleración de hardware? – Dialecticus
Creo que la forma de usar el GDI de la vieja escuela (que supongo que es utilizado internamente por MFC) en Win7 simplemente no es bueno. Mi consejo es activar GDI + way. (http://msdn.microsoft.com/en-us/library/ms535991(v=VS.85).aspx). Podrías tratar de decirnos los resultados. – Keynslug
¿Has visto esto? http://blog.m-ri.de/index.php/2009/02/15/slow-drawtext-performance-in-vista-and-windows-7-please-comment/ –