【问题标题】:Data binding performance issues数据绑定性能问题
【发布时间】:2011-12-15 14:39:29
【问题描述】:

我正在编写一个可以显示几何图形的地图控件。为了获得更好的性能,我使用DrawingVisuals 绘制所有几何图形,然后将其写入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 替换、数据绑定改进)?

提前致谢,

【问题讨论】:

    标签: wpf data-binding graphics gis


    【解决方案1】:

    数据绑定在单独的线程中更新。所以这总是有延迟的。它也适用于队列,因此当数据绑定无法跟上时,队列会变得越来越大。解决方案是您使用静态图像并更改图像本身,而不是用另一个图像替换它。

    【讨论】:

    • 静态图像是共享资源,需要锁定,仍然会降低性能
    • 在 de Dispatcher 线程中完成更改时不必锁定它。
    猜你喜欢
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 2011-01-17
    相关资源
    最近更新 更多