@Ifry

Как правильно отобразить большое количество Ellipse на Canvas (WPF)?

На форме (WPF) есть canvas и кнопка. При нажатии на кнопку запускается таймер, который каждые 100мс рисует большое количество эллипсов (около 5 тысяч). Вот пример как я их рисую:
public partial class MainWindow : Window
    {
        DispatcherTimer Timer;
        public MainWindow()
        {
            InitializeComponent();
            Timer = new DispatcherTimer();
            Timer.Tick += new EventHandler(Timer_Tick);
            Timer.Interval = new TimeSpan(0, 0, 0, 0, 100);
        }

        private void Timer_Tick(object sender, EventArgs e)
        {
            canvas.Children.Clear();
            Random rnd = new Random(DateTime.Now.Millisecond);
            for (int j = 0; j < 5000; j++)
            {
                Ellipse ell = new Ellipse();
                ell.Height = 6;
                ell.Width = 6;
                ell.Fill = Brushes.Black;
                ell.Margin = new Thickness(
                    rnd.Next(0, 300),
                    rnd.Next(0, 300),
                    0,
                    0);
                canvas.Children.Add(ell);
            }
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            Timer.Start();
        }
    }

Проблема в том, что при таком большом количестве эллипсов идет сильная нагрузка на ЦП. Как можно сделать правильней и уменьшить нагрузку на ЦП?
  • Вопрос задан
  • 523 просмотра
Решения вопроса 1
Nipheris
@Nipheris Куратор тега C#
Для начала стоит подумать, как можно создать эллипсы однократно, а не каждые 100 миллисекунд. Графические объекты в WPF довольно тяжелые, и создавать их лучше один раз, и затем повторно использовать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
AxisPod
@AxisPod
Естественно, что еще ожидать. Самое простое, отрисовывайте их в какой-нить буфер, который потом и выводите на канву. А второй, это копайте в сторону Direct2D (примитивы из коробки), если достаточно поддержки от 8ки и выше, если же нет, то в сторону других графических API.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы