@daniil14056

Как по массиву точкек нарисовать круг WPF? Из миллиона точек?

За основу к примеру такой код, который находиться в 50% примерах, вдругих 500% примерах на Канвас пихают миллионы Линий, каждая из которых объект FrameworkElement. Что еще хуже.

Я не понимаю, зачем к приемеру в коде ниже. перевыполняются операции отрисовки?
К примеру есть 50 точек, на каждой итерации надо отрисовать 10 из них, тогда код сделает так
  1. Нарисует 10 линий
  2. Нарисует 20 линий
  3. Нарисует 30 линий
  4. Нарисует 40 линий
  5. Нарисует 50 линий

В итоге время перерисовки растет.
Тогда как он на каждой итерации уже нарисовал 10, зачем он перерисовыет от нуля.
Как перерисовывать только по 10 линий? За константное время?
void _init()
        {
            var t = new DispatcherTimer();
            t.Interval = TimeSpan.FromMilliseconds(1);
            int maxLen = 1000*100;
            int dn = 1000;
            len = dn;
            t.Tick += (s, e) =>
            {
                len += dn;
                if (len >= maxLen)
                    len = dn;
            };
            t.Start();
        }
        protected override void OnRender(DrawingContext dc)
        {
            base.OnRender(dc);
            if (ps != null)
            {
                Point p0 = ps[0];
                for (int i = 0; i < len; i++)
                {
                    dc.DrawLine(pen, p0, ps[i]);
                    p0=ps[i];
                }
//как сделать
for (int i = beg; i < end; i++)
                {
                    dc.DrawLine(pen, p0, ps[i]);
                    p0=ps[i];
                }
            }
        }

Как оптимизировать этот ход. через DrawingGroup или RenderTargetBitmap? Я сделал, но у меня какие-то утечки памяти Если уменьшать Интервал анимации,(хотя утечек нету). Память просто растет очень быстро. куда-то.

И зачем в каждом графическом Фреймворке, есть вот такой похожий цикл отрисовки. Зачем вызывается перерисовка элемента каждый раз с нуля. Если 99.9999999% его содержало не изменилось.
Как можно сделать
OnRender( var g){ 
     base.OnRender();
      // мой код 
   }
///// 
OnRender( var g){
 if(/*если что-то изменилось*/){
     base.OnRender();
      // мой код 
   }

}
  • Вопрос задан
  • 253 просмотра
Пригласить эксперта
Ответы на вопрос 1
@AlexHell
Зачем вызывается перерисовка элемента каждый раз с нуля. Если 99.9999999% его содержало не изменилось.

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

.. если же у вас вопрос - почему они перерисовывают треугольники \ круги \ полигоны (легкие) - потому что это просто реализовать (и код простой) и быстро происходит (т.к. не тяжелая графика), а хранение RenderTexture на каждый элемент это потребление памяти (мегабайты допустим на каждый, но зависит от размера экрана и\или размера элемента), плюс усложнение кода (когда перерендеривать целиком обеъкт в RenderTexture, сам код вывода из RenderTexture в экран) или воспользоваться чемто готовым - но это тоже усложнения так и так по сравнению с рендером каждый фрейм всего что надо в экранный буфер
Ответ написан
Ваш ответ на вопрос

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

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