2010-01-13 3 views
6

Приложение, в котором работает наша компания, в настоящее время отображает множество прямоугольных фигур с градиентами для рисования «Плитки». Возникла внутренняя дискуссия, которая поставила вопрос о производительности. Эти плитки составляют около 100 пикселей на 200 пикселей, а также градиент затенен красным, желтым или зеленым. В любой момент времени на экране может отображаться до 100 таких фрагментов. Было бы более впечатляющим для нас создание изображения для каждого (красного, желтого, зеленого) и повторения его при необходимости, или было бы лучше, если бы мы продолжили рисовать их с помощью стандартных кистей WPF?Является ли много повторяющихся изображений более или менее показательными, чем использование кистей в WPF?

РЕДАКТ. Для уточнения, мы используем градиентную кисть LinearGradientBrush.

+0

Какую метрику вы больше всего интересуете? Скорость, использование памяти, использование процессора и т. Д. –

+0

Производительность графики, использование процессора и т. Д. Когда я просматриваю список сотен таких градиентных плит, я наблюдаю за мерцанием экрана и высоким использованием процессора. Мы пробовали несколько вещей, чтобы помочь производительности, но не повезло. Мне было интересно, поможет ли использование растрированных изображений. – Kilhoffer

+0

Мерцание и высокая загрузка процессора всего лишь на несколько сотен из этих плит? Какие объекты вы создаете для плиток? Вы создаете полнофункциональные FrameworkElements или UIElements или работаете с классом Visual Studio более низкого уровня? – Charlie

ответ

1

Исходя из опыта, рисование их с помощью кистей будет иметь гораздо лучшую производительность. Накладные расходы на загрузку изображений плитки и их рендеринг велики по сравнению с отображением заполненных прямоугольников.

+0

Можете ли вы рассказать мне о технических причинах того, почему градиентные кисти лучше? Если это так, то щедрость будет твоей. – Kilhoffer

+0

Технические причины довольно простые. IO всегда является одной из самых дорогостоящих операций, которые вы можете сделать. Чтение изображений из файлов потребует времени; что-то без этого накладных расходов займет меньше времени. Как только вы нажмете на фактический код рендеринга, он будет сводиться к одному и тому же (высоко оптимизированному DirectX), но разница в кисти не имеет накладных расходов для создания изображения. – Charlie

+0

Извините, я должен был упомянуть об этом в своем посте. Я отредактирую соответственно. Есть только 3 изображения, которые будут повторяться. Единственный IO читает их в первый раз. После этого они кэшируют ресурсы. – Kilhoffer

1

Единственный способ прояснить это - попытаться в обоих направлениях и измерить эффективность каждого подхода.

Вам нужно будет добавить код во время цикла рендеринга и записать результат в файл, а затем заставить 1000 (или даже 100 000) перерисовывать, чтобы получить реалистичную цифру.

Чувство моего чувства заключается в том, что LinearGradientBrush будет быстрее, чем загрузка изображения (даже из ресурсов), - но я готов быть доказанным неправильно.