Проблема производительности Silverlight Listbox с ListBox - PullRequest
1 голос
/ 26 февраля 2009

Я разрабатываю приложение Silverlight, которое отображает элементы в элементе управления списком, и у меня возникла небольшая проблема с производительностью.

Каждый элемент в списке представляет собой пользовательскую панель стека с некоторым форматированным текстом и т. Д.

Когда у меня есть список из 500 или менее элементов, список работает нормально, но при загрузке большего количества данных возникают проблемы. При 1000 предметах Silverlight потребляет 10% процессорного времени, даже если я ничего не делаю, при 3000 штук процессор постоянно использует 32-36%.

Это на двухъядерной машине, на более старой машине, которую я тестировал на использовании процессора, идет вверх.

Это также влияет на частоту кадров, я получаю 6 кадров в секунду со списком элементов 3000, что делает приложение медленным.

Кто-нибудь знает, что может быть причиной этого? Моей первой мыслью было, что silverlight пытается отобразить все элементы, даже если эти элементы находятся за пределами экрана ... это выглядит логично, как будто я вставляю элементы с их Visability. *

PS: я работаю в режиме без окон = "true", так как мне нужно отобразить html поверх моей формы silverlight.

Ответы [ 5 ]

3 голосов
/ 26 февраля 2009

Вы должны использовать DataGrid в Silverlight 2, потому что он поддерживает виртуализацию пользовательского интерфейса. Он был протестирован с миллионами предметов и создаст достаточно визуальных элементов, необходимых для отображения.

1 голос
/ 26 февраля 2009

+ 1 для использования Silverlight DataGrid в этом сценарии, убедитесь, что у вас установлена ​​ последняя версия , так как версия Silverlight SDK по умолчанию содержит несколько ошибок.

Другой вариант - использовать бесплатный элемент управления Silverlight DataGrid , доступный здесь . Одной из его функций является также контейнер строк Virtual StackPanel, который означает, что сетка может обрабатывать неограниченное количество строк.

Сравните производительность каждого из них и посмотрите, какой из них лучше всего подходит для вашей ситуации.

1 голос
/ 26 февраля 2009

Ваше предположение в основном верно. Хотя Silverlight не пытается отрисовать всех 3000 элементов в ListBox, ему все равно необходимо создать 3000 объектов ListBoxItem, которые, в свою очередь, получают Измерение и Упорядочение во время макета и т. Д., Только для того, чтобы они были обрезаны при визуализации время. Компоновка происходит намного быстрее, когда элементы свернуты (поскольку в этом сценарии макет практически ничего не делает).

В WPF есть VirtualizingStackPanel, который решит эту проблему, к сожалению, в Silverlight этот элемент отсутствует.

0 голосов
/ 01 марта 2016

Это помогло мне: Silverlight DeferredLoadListBox . Написано Дэвидом Ансоном, сотрудником Microsoft.

DeferredLoadListBox происходит от ListBox, но имеет гораздо лучшую производительность.

0 голосов
/ 04 ноября 2011

Просто наблюдение - похоже, с Silverlight 4 это больше не проблема. Добавление 100K элементов в список с шаблонами данных происходит мгновенно, а также хорошо воспроизводится.

...