我正在开发一个应用程序,它需要以网格的形式绘制大约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台计算机上运行:
问题在于,我的第一台计算机程序运行顺畅,对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通信是瓶颈?