Нужно что-то быстро нарисовать много изображений в WPF - PullRequest
5 голосов
/ 16 февраля 2011

Я работаю над Генератором клеточных автоматов в .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;

            }

        }
    }

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

Ответы [ 2 ]

3 голосов
/ 17 февраля 2011

Как написано в этой статье, самый быстрый способ рисовать 2D в wpf - StreamGeomerty.Я уверен, что вы можете приспособить логику генерации паттернов к потребностям этого класса.

1 голос
/ 17 февраля 2011

Реальная сила WPF в векторе рендеринга.Есть ли способ, чтобы вместо использования изображения вы могли создавать прямоугольные объекты заранее определенного размера, назначать цвет, а затем назначать местоположение?Растровое изображение довольно ресурсоемко для работы с вектором.Несмотря на то, что WPF переносит рендеринг на видеокарту, он все еще требует большой обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...