Win8 C# - 如何有效地一次绘制多个数字?

时间:2014-08-13 12:59:36

标签: c# microsoft-metro drawing

在Metro应用程序中绘制大量数据时,我遇到了很大的性能问题。我试过了:

我正在研究“生命游戏”应用程序,它基本上需要在很短的时间内绘制至少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));
        }
    }
}

BitmapWriteableBitmap类的一个实例,它显示在Image控件上。 Field.CellAliveField.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

0 个答案:

没有答案