У меня есть приложение Silverlight, которое использует Bing Maps.Мне нужно показать ~ 10000 маркеров по всей поверхности Земли.Эти маркеры являются простыми Path
экземплярами, большинство из которых имеют одинаковую форму, хотя они имеют разные повороты, которые применяются с помощью RotateTransform
.
. Производительность сейчас составляет около 6 FPS.Я пробовал различные подходы, чтобы улучшить ситуацию, но ничто не становится выше этого.
Логическое дерево напоминает:
<Map>
<MapLayer>
<Path ... />
<Path ... />
<Path ... /> <!-- and so on, several thousand times -->
Однако экземпляры Path
добавляются программно.Их позиции устанавливаются с помощью привязок, хотя эти привязки не срабатывают во время панорамирования и поэтому не должны способствовать возникновению проблем, с которыми я сталкиваюсь.
var path = new Path { /* ... */ };
path.SetBinding(MapLayer.PositionProperty, new Binding("Location")
{
Source = asset,
Mode = BindingMode.OneWay
});
Я попытался включить ускорение графического процессора и кэширование растровых изображений для MapLayer
и подтвердил, что это было правильно включено, наблюдая статистику GPU в Process Explorer, а также включая счетчики FPS / наложения кэша на хосте Silverlight.Это мало или совсем не влияло на FPS.Даже если это помогло, невозможно кэшировать растровые изображения выше некоторого порогового значения (квадрат 2048 пикселей?), И поэтому при небольшом увеличении масштабирования возвращается к программному рендерингу.
Немного углубимся вПрофилировщик CPU dotTrace, похоже, ограничивающим фактором является повторные вызовы Measure
/ Arrange
.Я подозреваю, что это потому, что, поскольку дети слева от карты прокручиваются достаточно далеко влево, они оборачиваются вокруг Земли и перемещаются в крайнее правое положение (и наоборот), что приводит к аннулированию макета, а также любого растрового изображениякэш.Я не думаю, что есть простой способ обойти это наказание.
Кто-нибудь еще сталкивался с этой проблемой и в идеале нашел путь для исследования?
Некоторые случайные идеи вещей, которые можно попробовать:
- Извлечение непосредственно из
MapLayerBase
вместо MapLayer
и самостоятельная реализация алгоритма компоновки, без учета свойства зависимости MapLayer.PositionProperty
и общей поддержки IProjectable
. - Расследование с использованием
MapItemsControl
вместо MapLayer
. - Проецирование дочерних элементов на изображения и рендеринг в виде простых плиток.