我在MFC應用程序中注意到我正在開發一個拖動滾動條以平滑向下滾動文檔的框架,當包含一段文本的塊打開屏幕,但在屏幕外光滑柔滑。調查的性能,我發現單一的CDC::DrawText
要求負責文本的段落。這是一個優化的發佈版本。使用Win7 x64上的DrawText性能不佳
我用QueryPerformanceCounter
得到的只是的DrawText的通話高分辨率測量,像這樣:
QueryPerformanceCounter(...);
pDC->DrawText(some_cstring, some_crect, DT_WORDBREAK);
QueryPerformanceCounter(...);
文本是unicode,LOREM-存有風格填料,865個字符長,包過7 (Segoe UI,lfHeight
= -12,一個標準的正文文本大小)的矩形和字體。從我的測量結果來看,單獨的單獨的平均需要7.5毫秒,而單峯值爲21毫秒。 (注意跟上60Hz的顯示器,你得到約16毫秒,從而使得各更新。)
我試圖做一些改變,以提高性能:
- 卸下
DT_WORDBREAK
提高性能,以約1毫秒(約7時間更快),但由於只有一行文本正在屏幕上顯示,並且有超過7行的文字中斷,這似乎暗示了其他地方的瓶頸。 - 我在透明模式下繪製文本(
SetBkMode(TRANSPARENT)
)。所以我嘗試了一種不透明的模式,用一個堅實的背景填充。沒提升。 - 我以爲ClearType渲染可能是怪罪。我將字體
lfQuality
從CLEARTYPE_QUALITY
更改爲NONANTIALIASED_QUALITY
。它看起來像帶有鋒利邊緣的廢物,沒有任何改進。 - 根據評論建議,我使用的是CMemDC,但是我擺脫了它並做了直接繪圖。它像瘋了一樣閃爍,沒有改善。
這是運行在Windows 7 64位筆記本電腦與英特爾酷睿2雙核P8400 @ 2.26 GHz和4 GB的RAM - 我不認爲它算作一個緩慢的系統。
每次繪製時我都會調用DrawText(),這顯然會影響性能,因爲這樣的函數很慢,尤其是如果幾個文本塊可以同時顯示的話。這足以讓體驗感到呆滯。然而,Firefox可以使用更多的文本在ClearType中呈現像這樣的頁面,並且似乎應對得很好。我究竟做錯了什麼?我如何解決實際DrawText調用的糟糕表現?
如果更改硬件加速,會發生什麼情況? – Dialecticus 2010-11-25 21:15:21
想想在Win7上使用老派GDI(我認爲MFC內部使用)的方式根本就不好。我的建議是轉向GDI +的方式。 (http://msdn.microsoft.com/en-us/library/ms535991(v=VS.85).aspx)。你可以試着告訴我們結果。 – Keynslug 2010-11-25 21:18:34
看過這個嗎? http://blog.m-ri.de/index.php/2009/02/15/slow-drawtext-performance-in-vista-and-windows-7-please-comment/ – 2010-11-25 21:21:10