需要一些东西在WPF中快速绘制许多图像

时间:2011-02-16 18:53:03

标签: c# .net wpf

我正在研究.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;

            }

        }
    }

感谢所有回复

2 个答案:

答案 0 :(得分:3)

正如this文章所述,在wpf中绘制2D的最快方法是StreamGeomerty。 我相信你能够满足你的模式生成逻辑来满足这个类的需要。

答案 1 :(得分:1)

WPF实际功率处于渲染向量中。有没有一种方法,而不是使用图像,您可以创建预定大小的矩形对象指定颜色,然后分配位置?使用vs vector时,位图是非常耗费资源的。即使WPF将渲染推送到视频卡,它仍然需要大量处理。