Проблемы с производительностью привязки данных - PullRequest
2 голосов
/ 15 декабря 2011

Я пишу элемент управления картой, который может отображать набор геометрических фигур. Для лучшей производительности я рисую все свои геометрии, используя DrawingVisual s, которые затем записываю в RenderTargetBitmap, как показано в коде ниже:

public class Map{
   public ImageSource MapDrawingImage{get;set;}

   private void RenderMap(){
    MapDrawingImage= new RenderTargetBitmap(w, h, 96, 96, PixelFormats.Pbgra32);
    foreach (Layer layer in map.Layers) {
        System.Windows.Media.DrawingVisual layerDrawing = Render(layer, map);
        MapDrawingImage.Render(layerDrawing);
    }
   }
}

Для отображения карты в главном окне есть элемент управления Image, для которого Source установлен на Map.MapDrawingImage источник изображения. Для автоматического обновления изображения я использую следующую привязку данных:

    RenderOptions.SetBitmapScalingMode(mapImage, BitmapScalingMode.LowQuality);
    // Map image binding
    Binding mapBinding = new Binding();
    mapBinding.Source = map;
    mapBinding.Path = new PropertyPath("MapDrawingImage");
    mapImage.SetBinding(System.Windows.Controls.Image.SourceProperty, mapBinding); 

Это очень хорошо работает, когда карта статична. Однако в динамическом режиме, когда карта обновляется со скоростью от 5 до 10 раз в секунду, привязка данных, похоже, немного отстает, и приложение замедляется. Я искал долгие дни и узнал, что:

  1. RenderTargetBitmap не использует аппаратное ускорение, что вызывает некоторые задержки при рендеринге карты.
  2. Привязка данных также может вызывать некоторые задержки при обновлении изображения карты

Есть ли лучший способ улучшить производительность карты (RenderTargetBitmap замена, улучшение привязки данных)?

Заранее спасибо,

1 Ответ

1 голос
/ 20 декабря 2011

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

...