Я работаю над Генератором клеточных автоматов в .NET 3.5. Я решил использовать WPF, потому что хотел узнать что-то новое в WPF.
Я рисую одномерные автоматы, как правило 30, и двухмерные, как Жизнь .
Мне нужно что-то, чтобы быстро нарисовать много изображений.
Например, размеры меша - 64 х 64, а размер ячейки - 12 пикселей. Поэтому я рисую 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;
}
}
}
Спасибо за все ответы