我正在研究.NET 3.5中的细胞自动机生成器。我决定使用WPF,因为我想学习WPF中的新内容。
我像规则30和二维一样绘制一维自动机,如Life。
我需要快速绘制许多图像的东西。
例如,网格的尺寸为64 x 64,单元格的尺寸为12px。所以我一步画出64 * 64 = 4096张图像。并且一步之间的间隔约为100毫秒。
我将我的应用程序重写为WinForms,并且一切正常。但是WPF很慢,我不知道为什么。
我在WPF中绘图的例子:
我有一个派生自Image的类。在这个类中,我绘制了一个位图,我在Source属性中使用它。
public void DrawAll()
{
DrawingGroup dg = new DrawingGroup();
for (byte i = 0; i < this.DimensionX; ++i)
{
for (byte j = 0; j < this.DimensionY; ++j)
{
Piece p = this.Mesh[i][j];
Rect rect = new Rect(j * this.CellSize + (j + 1), i * this.CellSize + (i + 1),
this.CellSize, this.CellSize);
ImageDrawing id = new ImageDrawing();
id.Rect = rect;
if (p == null)
id.ImageSource = this._undefinedPiece.Image.Source;
else
id.ImageSource = p.Image.Source;
dg.Children.Add(id);
}
}
DrawingImage di = new DrawingImage(dg);
this.Source = di;
}
WPF绘图的第二个例子:
我从Canvas派生了类并覆盖了OnRender函数。基于这篇文章:http://sachabarber.net/?p=675
protected override void OnRender(DrawingContext dc)
{
base.OnRender(dc);
for (byte i = 0; i < this.DimensionX; ++i)
{
for (byte j = 0; j < this.DimensionY; ++j)
{
Rect rect = new Rect(j * this.CellSize + (j + 1), i * this.CellSize + (i + 1),
this.CellSize, this.CellSize);
BitmapImage bi;
int counter = i + j + DateTime.Now.Millisecond;
if (counter % 3 == 0)
bi = this.bundefined;
else if (counter % 3 == 1)
bi = this.bwhite;
else
bi = this.bred;
dc.DrawImage(bi, rect);
++counter;
}
}
}
感谢所有回复
答案 0 :(得分:3)
正如this文章所述,在wpf中绘制2D的最快方法是StreamGeomerty。 我相信你能够满足你的模式生成逻辑来满足这个类的需要。
答案 1 :(得分:1)
WPF实际功率处于渲染向量中。有没有一种方法,而不是使用图像,您可以创建预定大小的矩形对象指定颜色,然后分配位置?使用vs vector时,位图是非常耗费资源的。即使WPF将渲染推送到视频卡,它仍然需要大量处理。