Низкая производительность DrawText в Win7 x64

Я заметил в разрабатываемом мной приложении MFC при перетаскивании полосы прокрутки для плавной прокрутки вниз по документу частота кадров падает до прерывистого уровня, когда на экране отображается блок, содержащий примерно абзац текста, но за кадром шелковисто-гладко. Исследуя производительность, я обнаружил единственный вызов CDC :: DrawText для ответственного абзаца текста. Это оптимизированная версия выпуска.

Я использовал QueryPerformanceCounter , чтобы получить измерение с высоким разрешением только вызов DrawText, например:

QueryPerformanceCounter(...);
pDC->DrawText(some_cstring, some_crect, DT_WORDBREAK);
QueryPerformanceCounter(...);

Текст в юникоде, Заполнитель стиля lorem-ipsum, длиной 865 символов и переносит 7-ми-битные строки с учетом прямоугольника и шрифта (Segoe UI, 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?

8
задан AshleysBrain 26 November 2010 в 16:17
поделиться