Что-то нужно быстро рисовать много изображений в WPF

Я работаю над Генератором клеточных автоматов в .NET 3.5. Я решил использовать WPF, потому что хотел узнать что-то новое в WPF.

Я рисую Одномерные автоматы, такие как Правило 30, и Двумерные, такие как Жизнь .

Мне нужно что-то, чтобы быстро рисовать много изображений.

Например, размеры сетки 64 x 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;

            }

        }
    }

Спасибо за все ответы

5
задан austinem 16 February 2011 в 18:53
поделиться