За основу к примеру такой код, который находиться в 50% примерах, вдругих 500% примерах на Канвас пихают миллионы Линий, каждая из которых объект FrameworkElement. Что еще хуже.
Я не понимаю, зачем к приемеру в коде ниже. перевыполняются операции отрисовки?
К примеру есть 50 точек, на каждой итерации надо отрисовать 10 из них, тогда код сделает так
- Нарисует 10 линий
- Нарисует 20 линий
- Нарисует 30 линий
- Нарисует 40 линий
- Нарисует 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();
// мой код
}
}