Является ли эта медленная производительность TextBlock нормальной?
Нет. Такая медленная производительность TextBlock определенно не нормальная . Мой опыт показывает, что TextBlocks гораздо быстрее.
Я провел несколько тестов, используя опубликованный вами код, оставив интервал обновления равным 0,1 с и изменив аппаратное обеспечение и количество текстовых блоков. Вот что я нашел:
10 TextBlocks, 2.16GHz Core 2 Duo, Radeon 4100 GPU: CPU Usage "0%"
10 TextBlocks, 2.16GHz Core 2 Duo, Software rendering: CPU Usage 1%
100 TextBlocks, 2.16GHz Core 2 Duo, Radeon 4100 GPU: CPU Usage 8%
100 TextBlocks, 2.16GHz Core 2 Duo, Software rendering: CPU Usage 18%
10 TextBlocks, 200MHz Pentium Pro, Software rendering: CPU Usage 35%
10 TextBlocks, 200MHz Pentium Pro, No rendering: CPU Usage 7%
Каждый из этих тестов предполагает, что WPF примерно в 10 раз быстрее, чем показывают ваши измерения. Если ваш код так прост, как кажется, я подозреваю, что с вашим GPU или драйверами DirectX происходит что-то странное.
Обратите внимание, что для 100 тестов TextBlock мне пришлось внести три изменения: добавление 90 TextBlocks, установка ItemsPanel в WrapPanel для получения данных в столбцах и уменьшение ширины TextBlock, чтобы все помещалось на экране.
Мой тест на 200 МГц Pentium Pro, вероятно, наиболее актуален для вашего встроенного оборудования. Если ваше приложение обновляет 10 TextBlocks каждые 0,5 с , вы можете рассчитывать на использование приблизительно 3% ЦП для обновления и перерисовки на 200 МГц ЦП.
Что если я хочу сделать это еще быстрее?
Использование списка связанных с данными TextBlocks очень удобно, но WPF также предоставляет механизмы более низкого уровня, которые можно использовать, когда вам нужна абсолютная максимальная производительность.
Текстовый блок WPF на самом деле содержит отформатированный документ, а не просто строку, поэтому это очень сложная структура данных. Довольно просто написать свой собственный элемент управления TrivialTextBlock
, который имеет строковый параметр и просто рисует его, используя унаследованные свойства TextElement (такие как FontSize, FontWeight и т. Д.). Обычно этого не делается, потому что TextBlock достаточно быстр для почти всех целей.
Еще одним соображением является то, что каждый раз, когда вы изменяете текст в TextBlock, WPF пересчитывает макет. В отличие от старых технологий, содержимое текстового блока WPF может очень легко изменить макет вашего пользовательского интерфейса. Таким образом, текст должен быть переоценен и переформатирован каждый раз, когда вы меняете его. Создание вышеупомянутого TrivialTextBlock
элемента управления также может ускорить это, фиксируя размер элемента управления и тем самым избегая проходов макета.
Третье соображение заключается в том, что форматировщик текста WPF имеет расширенные функции типографики, поддерживающие такие вещи, как кернинг, двунаправленный текст, лигатуры, функции юникода, настраиваемые веса шрифтов и т. Д. Чтобы получить абсолютную максимальную производительность в WPF, вы можете полностью обойти форматировщик текста и нарисуйте свой текст в виде серии изображений. Для этого требуется около 20 строк XAML и около 40 строк кода C #.
Все эти оптимизации возможны, но в вашем случае я не стал бы с ними беспокоиться: сделать это, чтобы сэкономить всего лишь 3% использования ЦП, вероятно, не стоит.