我正在开发.NET 3.5中的元胞自动机生成器。我决定使用WPF,因为我想学习一些新的WPF知识。
我绘制像Rule 30这样的一维元胞自动机和生命游戏这样的二维元胞自动机。
我需要一种快速绘制多张图片的方法。
例如,网格的尺寸为64 x 64,每个单元格的大小为12px。因此,我在一个步骤中要绘制64*64 = 4096张图像。每一步之间的间隔大约为100毫秒。
我将应用程序重写为WinForms,一切都好了。但是在WPF中很慢,我不知道原因。
我在WPF中绘制的示例: 我有一个继承自Image的类。在这个类中,我绘制一个位图,并将其用作Source属性的值。
感谢所有回复。
我绘制像Rule 30这样的一维元胞自动机和生命游戏这样的二维元胞自动机。
我需要一种快速绘制多张图片的方法。
例如,网格的尺寸为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;
}
}
}
感谢所有回复。