C # WPF как рисовать геометрию группы - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь создать простую визуализацию с большим количеством геометрических объектов, которые нужно нарисовать (более 10000), однако в настоящее время я пытаюсь понять правильный ход программы. Как именно я могу эффективно нарисовать эту группу геометрии в окне?

namespace DataVisualizer
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Canvas newCanvas = new Canvas();
            DrawingGroup tmpDrawing = new DrawingGroup();
            GeometryGroup geoGroup = new GeometryGroup();
            Brush brush = new SolidColorBrush(Colors.Blue);
            int particleCount = 10000;
            int particleWidth = 5;
            int particleHeight = 5;
            Random rnd = new Random();

            //create all the geometry and add it too the geometry group
            for (int x = 0; x < particleCount; ++x)
            {
                geoGroup.Children.Add(new RectangleGeometry(new Rect(rnd.Next(500), rnd.Next(500), particleWidth, particleHeight)));
            }

            tmpDrawing.Children.Add(new GeometryDrawing(brush, null, geoGroup));


            newCanvas.Children.Add(new DrawingImage(tmpDrawing)); //does not work
            newCanvas.Background = new DrawingImage(tmpDrawing); //does not work

            //it seems i dont wana be using UIElement.. how do i effeciently draw geometry?
        }
    }
}

Я считаю, что в Интернете нет простого объяснения, описывающего общий поток. Любая помощь с благодарностью.

1 Ответ

1 голос
/ 08 ноября 2019
  1. [Необязательно] Унаследовать от Control для изоляции логики рисования
  2. Переопределить OnRender (DrawingContext dc)
  3. Использовать DrawingContext.DrawGeometry (кисть, перо, геометрия)

Рассмотрите возможность замораживания кистей, ручек и геометрии, чтобы улучшить производительность. Имейте в виду, что DrawingContext API не отображает сразу. Это скорее шаблон Builder, применяемый для чертежей - он собирает инструкции о том, что, где и как визуализировать.

Для системы частиц вы можете получить лучшие результаты, используя WriteableBitmap, Viewport3D, какую-нибудь стороннюю оболочку DirectX / OpenGL,но для 10 000 прямоугольников OnRender () + InvalidateVisual () может быть достаточно

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