在Metro应用程序中绘制大量数据时,我遇到了很大的性能问题。我试过了:
Rectangles
添加到Grid
(糟糕的是,不要这样做),WriteableBitmap
不提供绘图功能。)我正在研究“生命游戏”应用程序,它基本上需要在很短的时间内绘制至少32x32的矩形。我认为C#+ XAML不适合这样的应用程序,但我现在没有时间学习DirectX,这可能是最好的选择。
绘图本身非常简单,这是代码:
public void DrawFieldArray()
{
Bitmap.Clear(Color.FromArgb(100, 100, 100, 100));
Int32 ArraySize = FieldArray.GetLength(0);
for (int i = 0; i < ArraySize; ++i)
{
for (int j = 0; j < ArraySize; ++j)
{
Field CurrentField = FieldArray[i, j];
Bitmap.FillRectangle(CurrentField.Pos.Column + 1,
CurrentField.Pos.Row + 1,
CurrentField.Pos.Column + Field.CellSize - 1,
CurrentField.Pos.Row + Field.CellSize - 1,
(CurrentField.IsAlive ? Field.CellAlive : Field.CellDead));
}
}
}
Bitmap
是WriteableBitmap
类的一个实例,它显示在Image
控件上。 Field.CellAlive
和Field.CellDead
是预定义的颜色。这段代码工作得非常慢,我不知道如何提高性能。我试图在背景中绘制它然后显示它,但在有效性的情况下它是相同的。如果你知道任何好的绘图库或技巧使它更快,我将非常感激。在谷歌很难找到关于这个主题的东西。
- 编辑 -
终于明白了。我所要做的就是使用GetBitmapContext()
方法:
using (Bitmap.GetBitmapContext())
{
for (int i = 0; i < ArraySize; ++i)
{
for (int j = 0; j < ArraySize; ++j)
{
Field CurrentField = FieldArray[i, j];
Bitmap.FillRectangle(CurrentField.Pos.Column + 1,
CurrentField.Pos.Row + 1,
CurrentField.Pos.Column + Field.CellSize - 1,
CurrentField.Pos.Row + Field.CellSize - 1,
(CurrentField.IsAlive ? Field.CellAlive : Field.CellDead));
}
}
}
现在它完美无缺:)这是解决方案的链接:http://writeablebitmapex.codeplex.com/discussions/432111。