Я заметил, что в приложении MFC, которое я разрабатываю, при перетаскивании полосы прокрутки для плавной прокрутки вниз по документу частота кадров падает до прерывистых уровней, когда блок, содержащий около абзаца текста, отображается на экране, но шелковисто, когдазакадровый.Исследуя представление, я обнаружил один CDC::DrawText
призыв к параграфу текста.Это оптимизированная сборка релиза.
Я использовал QueryPerformanceCounter
для получения измерения высокого разрешения просто вызова DrawText, например:
QueryPerformanceCounter(...);
pDC->DrawText(some_cstring, some_crect, DT_WORDBREAK);
QueryPerformanceCounter(...);
Текст представляет собой Unicode, заполнитель в стиле lorem-ipsum, 865 символов в длину и переносится по 7-битовым строкам с учетом прямоугольника и шрифта (пользовательский интерфейс Segoe, lfHeight
= -12, стандартный размер основного текста).По моим измерениям, этот вызов в одиночку занимает в среднем 7,5 мс с нечетным пиком в 21 мс.(Обратите внимание, что при работе с монитором с частотой 60 Гц вы получаете около 16 мс для рендеринга каждого обновления.)
Я попытался внести некоторые изменения, чтобы улучшить производительность:
- Удаление
DT_WORDBREAK
улучшаетпроизводительность примерно до 1 мс (примерно в 7 раз быстрее), но с учетом того, что только одна строка текста выводит его на экран, и было более 7 строк с разрывом слов, это, как мне кажется, указывает на узкое место в другом месте. - Я рисовал текст в прозрачном режиме (
SetBkMode(TRANSPARENT)
).Поэтому я попробовал непрозрачный режим со сплошной фоновой заливкой.Без улучшений. - Я думал, что виноват рендеринг ClearType.Я изменил шрифт
lfQuality
с CLEARTYPE_QUALITY
на NONANTIALIASED_QUALITY
.Это выглядело как дерьмо с острыми краями и все, без каких-либо улучшений. - Согласно предложению комментария, я использовал CMemDC, но я избавился от него и сделал прямое рисование.Он мерцал как сумасшедший, и никаких улучшений.
Это работает на 64-разрядном ноутбуке с Windows 7 с Intel Core 2 Duo P8400 @ 2,26 ГГц и 4 ГБ оперативной памяти - я не думаю, что этосчитается медленной системой.
Я вызываю DrawText () каждый раз, когда он рисует, и это явно снижает производительность при такой медленной функции, особенно если несколько из этих текстовых блоков видны одновременно.Этого достаточно, чтобы опыт ощущался вялым.Тем не менее, Firefox может отображать страницу, подобную этой, в ClearType с гораздо большим количеством текста, и, кажется, справляется просто отлично.Что я делаю неправильно?Как я могу обойти плохую производительность реального вызова DrawText?