Ответ 1
Разработчик Microsoft опубликовал статью некоторые интервалы и смещение противоречат друг другу. См. Инструмент конфигурации поверхности SQL Server 2005 для примера несогласованного рендеринга.
Нам нужно оптимизировать рендеринг текста для приложения С# Windows Forms, отображающего большое количество небольших строк в нерегулярной сетке. В любое время может отображаться более 5000 ячеек, которые обновляются 4 раза в секунду. Семейство и размер шрифта согласованы по всем ячейкам, хотя цвет может варьироваться от ячейки к ячейке, как и жирный/курсив/равный.
Я видел противоречивую информацию в Интернете о том, что TextRenderer.DrawText
vs. Graphics.DrawString
является самым быстрым/лучшим, что сводится к GDI vs. GDI + на уровне Win32.
Я также видел радикально разные результаты в Windows XP и Windows Vista, но моей основной целью является Windows XP. Статьи, обещающие большие успехи в WinFX и DirectX 10 здесь не помогают: - )
Какой лучший подход здесь? Я не боюсь вводить небольшой слой С++/CLI и оптимизировать обработку контекста устройства, чтобы выжать больше производительности, но я хотел бы получить некоторые окончательные советы о том, в каком направлении двигаться.
EDIT: Спасибо за первоначальные ответы. Я попытаюсь использовать комбинацию рендеринга растрового изображения и придерживаться эквивалентных вызовов GDI.
Разработчик Microsoft опубликовал статью некоторые интервалы и смещение противоречат друг другу. См. Инструмент конфигурации поверхности SQL Server 2005 для примера несогласованного рендеринга.
5000+ рендеринг текста медленный даже с GDI, особенно если вам нужна прокрутка. Создайте отдельный поток рендеринга и сообщите поток пользовательского интерфейса каждые 200 мс и бит биттете текущие результаты. Это дает плавный пользовательский интерфейс.
GDI быстрее при рисовании вообще GDI+. Я работал над проектом, который должен был привлечь тысячи строк и текстовых строк, а переход с GDI + на GDI значительно улучшился. Это было использование Windows XP, поэтому я не могу комментировать Vista. Я бы также рекомендовал использовать двойную буферизацию для вашего чертежа, чтобы повысить производительность. Создайте совместимый экранный растровый рисунок и повторите его использование каждый раз, когда вам нужно рисовать.
Создание класса взаимодействия С++/CLI для рисования в собственном коде приведет к сумасшедшему рисованию. Мы свидетели этого и измерили его.
Если вы этого не сделаете, мы обнаружили, что графика .DrawString немного быстрее, чем TextRenderer.DrawText.
В моей Windows 7 64-битной системе TextOut даже немного медленнее, чем DrawString! TextRenderer.DrawText намного медленнее, чем DrawString.