WPF DrawingVisual在某些机器上的性能

时间:2012-11-27 15:26:18

标签: wpf performance drawingvisual

我正在开发一个应用程序,它需要以网格的形式绘制大约70k个矩形(一个网格40x250和一个250x250)。当时并非所有矩形都会在屏幕上显示。

在阅读http://msdn.microsoft.com/en-us/magazine/dd483292.aspx之后,我创建了一个简单的控件(继承自FrameworkElement,下面列出了部件),它使用DrawingVisual descant来创建一列矩形。

// Removing items after collection change
private void RemoveItems(IList oldItems) {
    foreach (var oldItem in oldItems) {
        var visualChild = _visuals.FirstOrDefault(v => v.Data == oldItem);
        if (visualChild != null) {
            _visuals.Remove(visualChild);
            RemoveVisualChild(visualChild);
        }

        _translateTransform.X -= 8;
    }
}

// Adding items after collection change
private void AddItems(IList newItems) {
    foreach (var newItem in newItems) {
        var newArray = (byte[]) newItem;
        var visual = CreateVisual(newArray);
        _visuals.Add(visual);
        AddVisualChild(visual);
        _col++;
    }

}

// Creating visual element
private StripeVisual CreateVisual(byte[] data) {
    var result = new StripeVisual {
        Data = data,
        Transform = _translateTransform
    };

    using (var dc = result.RenderOpen()) {
        for (int i = 0; i < data.Length; i++) {
            dc.DrawRectangle(_brushes[data[i]], _strokePen, new Rect(_col * 8, i * 20, 8, 20));
        }
    }

    return result;
}

冻结所有画笔(Brushes类的成员)和_strokePen被冻结。每200毫秒将新的垂直条纹添加到集合中。

程序已在3台计算机上运行:

  1. 笔记本电脑:i7-2670QM,GeForce GT 540M / Intel HD Graphics 3000,4GB RAM,Win7 x64,DirectX11,
  2. PC:Core2Duo E7400,Radeon HD 4800,3GB RAM,Win7 x64,DirectX11,
  3. PC:i3 3,07GHz,Inter HD Graphics,3.3GB RAM,Win7 x86,DirectX11。
  4. 问题在于,我的第一台计算机程序运行顺畅,对CPU没有太大影响(使用率在1-10%之间)。在第二台和第三台计算机上,程序性能是不可接受的:大约30x100网格需要高达50%的处理器,而且一切运行速度都非常慢。即使只有一小部分网格可见,程序也会缓慢运行。

    看起来程序正在使用软件渲染(渲染线程使用50%的处理器),但RenderCapability.Tier >> 16返回2,RenderOption.ProcessRenderMode设置为Default。此外,[HKCU/Software/Microsoft/Avalon.Graphics]中没有可以禁用硬件加速的密钥。

    是否可以顺利运行此应用程序列出的计算机?我还能做些什么来最大限度地提高该计划的性能?

    更新

    设置DrawingVisual.CacheMode = new BitmapCache();帮助了很多。这是否意味着CPU&lt; =&gt; GPU通信是瓶颈?

0 个答案:

没有答案