我的代码中有一些性能问题...... 我需要为DrawingVisual渲染多色矩形。
第一个版本很简单:
using (DrawingContext dc = Canvas.RenderOpen())
{
for (Int32 x = 0; x < widthCount; x++)
for (Int32 y = 0; y < heightCount; y++)
{
Color c;
Double value = mass[x, y];
c = GetColorByValue(value);
dc.DrawRectangle(new SolidColorBrush(c), null,
new Rect(x * step - step / 2, y * step - step / 2, step, step));
}
}
如果矩形数量大约为250x250(并且它获得200Mb RAM),它就能正常工作。但如果它们的数量是750x750,那么渲染过程太长而且很慢(获得超过2.5Gb RAM)
下一步是使用像缓冲区这样的位图。但是我的DrawingVisual的大小存在问题。视觉真的很大。 因此,无法创建全尺寸位图,因为RenderTargetBitmap的构造函数会抛出异常“图像数据在处理期间生成溢出”。
最后我创建了一个小位图并将其拉伸到我的视觉效果。但是问题是一样的(它工作得太慢而且RAM很多)。
我应该怎样做才能让渲染元素的过程获得足够的时间和来源?
问候!
谢谢!
答案 0 :(得分:2)
是的!我找到了解决这个问题的方法! 我第一次错误地使用位图作为缓冲区。 但现在我正确使用它。 我的代码:
//temp visual
DrawingVisual tmpVisual = new DrawingVisual();
using (DrawingContext dc = tmpVisual.RenderOpen())
{
for (Int32 x = 0; x < widthCount; x++)
for (Int32 y = 0; y < heightCount; y++)
{
Color c;
Double value = mass[x, y];
c = GetColorByValue(value);
dc.DrawRectangle(new SolidColorBrush(c), null,
new Rect(x * step - step / 2, y * step - step / 2, step, step));
}
}
//resize visual
tmpVisual.Transform = new ScaleTransform(maxWidth/(widthCount * step),
maxHeight/(heightCount * step));
//visual to bitmap
RenderTargetBitmap bitmap =
new RenderTargetBitmap(maxWidth, maxHeight, 96, 96, PixelFormats.Pbgra32);
bitmap.Render(tmpVisual);
using (DrawingContext dc = Canvas.RenderOpen())
{
Rect rect = new Rect(0, 0, widthCount * step, heightCount * step);
dc.DrawImage(bitmap, rect);
}
我创建了一个临时视觉效果,减少它并将其渲染到位图。最后,我将它拉伸到我的视觉中。