Самый быстрый API для рендеринга текста в Windows Forms? - PullRequest
12 голосов
/ 16 сентября 2008

Нам нужно оптимизировать отрисовку текста для приложения C # Windows Forms , отображающего большое количество маленьких строк в неправильной сетке. В любое время может быть видно более 5000 ячеек, которые обновляются 4 раза в секунду. Семейство и размер шрифта одинаковы для всех ячеек, хотя цвет может варьироваться от ячейки к ячейке, как это будет выделено жирным шрифтом / курсивом / простым шрифтом.

Я видел противоречивую информацию в Интернете о том, что TextRenderer.DrawText против Graphics.DrawString является самым быстрым / лучшим, что сводится к GDI против GDI + сравнения на Win32 уровень.

Я также видел радикально отличающиеся результаты в Windows XP по сравнению с Windows Vista, но моя главная цель - Windows XP. Статьи, обещающие большие успехи под WinFX и DirectX 10 здесь не помогают: -)

Какой здесь лучший подход? Я не боюсь представить небольшой слой C ++ / CLI и оптимизировать обработку контекста устройства, чтобы снизить производительность, но мне хотелось бы дать определенный совет о том, какое направление выбрать.

EDIT: Спасибо за первоначальные ответы. Я попробую комбинацию фонового рендеринга растрового изображения и придерживаться эквивалентных вызовов GDI.

Ответы [ 5 ]

5 голосов
/ 16 сентября 2008

Разработчик Microsoft опубликовал в своем блоге статью GDI vs. GDI + Text Rendering Performance , которая отвечает на простой вопрос скорости: в его системе GDI DrawText был примерно в 6 раз быстрее, чем GDI + DrawString. *

Если вам нужно быть настоящим быстродействующим демоном, TextOut работает быстрее, чем DrawText, но вам придется позаботиться об отсечении и переносе слов самостоятельно. ExtTextOut поддерживает отсечение.

рендеринг GDI (TextRenderer) будет более согласованным с другими частями Windows, использующими GDI; GDI + пытается быть независимым от устройства, поэтому некоторые интервалы и подбадривания несовместимы . Обратитесь к инструменту настройки контактной зоны SQL Server 2005 для примера несогласованного рендеринга.

3 голосов
/ 16 сентября 2008

5000 + рендеринг текста идет медленно даже с GDI, особенно если вам нужна прокрутка. Создайте отдельный поток рендеринга и уведомляйте поток пользовательского интерфейса каждые 200 мс и отправляйте текущие результаты. Это дает гладкий пользовательский опыт.

2 голосов
/ 22 декабря 2010

В моей 64-битной системе Windows 7 TextOut даже немного медленнее, чем DrawString! TextRenderer.DrawText намного медленнее, чем DrawString.

2 голосов
/ 16 сентября 2008

Создание класса взаимодействия C ++ / CLI для рисования в нативном коде приведет к сумасшедшему быстрому рисованию. Мы это засвидетельствовали и измерили.

Если вы этого не делаете, мы обнаружили, что graphics.DrawString немного быстрее, чем TextRenderer.DrawText.

2 голосов
/ 16 сентября 2008

GDI быстрее при рисовании в целом, чем GDI +. Я работал над проектом, который должен был рисовать тысячи строк и текстовых строк, и переключение с GDI + на GDI значительно улучшило производительность. Это было использование Windows XP, поэтому я не могу комментировать Vista. Я также рекомендовал бы использовать двойную буферизацию для вашего рисунка, чтобы также улучшить производительность. Создайте совместимое закадровое растровое изображение и используйте его каждый раз, когда вам нужно рисовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...