WPF рисование производительности с большими количествами конфигураций

У меня есть проблемы с WPF рисование производительности. Существует много маленьких объектов EllipseGeometry (1 024 замещающих знака, например), которые добавляются к трем отдельным GeometryGroups с различными приоритетными кистями. После, я представляю все это на простом управлении Изображением. Код:

DrawingGroup tmpDrawing = new DrawingGroup();
GeometryGroup onGroup = new GeometryGroup();
GeometryGroup offGroup = new GeometryGroup();
GeometryGroup disabledGroup = new GeometryGroup();

for (int x = 0; x < DisplayWidth; ++x)
{
    for (int y = 0; y < DisplayHeight; ++y)
    {
        if (States[x, y] == true) onGroup.Children.Add(new EllipseGeometry(new Rect((double)x * EDGE, (double)y * EDGE, EDGE, EDGE)));
        else if (States[x, y] == false) offGroup.Children.Add(new EllipseGeometry(new Rect((double)x * EDGE, (double)y * EDGE, EDGE, EDGE)));
        else disabledGroup.Children.Add(new EllipseGeometry(new Rect((double)x * EDGE, (double)y * EDGE, EDGE, EDGE)));
    }
}

tmpDrawing.Children.Add(new GeometryDrawing(OnBrush, null, onGroup));
tmpDrawing.Children.Add(new GeometryDrawing(OffBrush, null, offGroup));
tmpDrawing.Children.Add(new GeometryDrawing(DisabledBrush, null, disabledGroup));
DisplayImage.Source = new DrawingImage(tmpDrawing);

Это хорошо работает, но занимает слишком много времени-> 0,5 с на Core 2 Quad,> 2 с на Pentium 4. Мне требуются <0,1 с везде. Все Эллипсы, как Вы видите, равны. Фон управления, где мой DisplayImage, является сплошным (черный, например), таким образом, мы можем использовать этот факт. Я пытался использовать 1 024 элемента Эллипса вместо Изображения с EllipseGeometries, и это работало намного быстрее (~0.5s), но недостаточно. Как ускорить его?

С уважением, Oleg Eremeev

P.S. Извините за мой английский язык.

9
задан Olegs Jeremejevs 7 March 2010 в 14:07
поделиться

2 ответа

Я оставил свой старый метод рендеринга, но создание нового объекта EllipseGeometry каждый раз было плохой идеей, поэтому я оптимизировал его следующим образом:

for (int x = 0; x < newWidth; ++x)
{
    for (int y = 0; y < newHeight; ++y)
    {
        States[x, y] = null;
        OnEllipses[x, y] = new EllipseGeometry(new Rect((double)x * EDGE + 0.5f, (double)y * EDGE + 0.5f, EDGE - 1f, EDGE - 1f));
        OffEllipses[x, y] = new EllipseGeometry(new Rect((double)x * EDGE + 0.5f, (double)y * EDGE + 0.5f, EDGE - 1f, EDGE - 1f));
        DisabledEllipses[x, y] = new EllipseGeometry(new Rect((double)x * EDGE + 0.5f, (double)y * EDGE + 0.5f, EDGE - 1f, EDGE - 1f));
    }
}

// . . .

DrawingGroup tmpDrawing = new DrawingGroup();
GeometryGroup onGroup = new GeometryGroup();
GeometryGroup offGroup = new GeometryGroup();
GeometryGroup disabledGroup = new GeometryGroup();

for (int x = 0; x < DisplayWidth; ++x)
{
    for (int y = 0; y < DisplayHeight; ++y)
    {
        if (States[x, y] == true) onGroup.Children.Add(OnEllipses[x, y]);
        else if (States[x, y] == false) offGroup.Children.Add(OffEllipses[x, y]);
        else disabledGroup.Children.Add(DisabledEllipses[x, y]);
    }
}

tmpDrawing.Children.Add(new GeometryDrawing(OnBrush, null, onGroup));
tmpDrawing.Children.Add(new GeometryDrawing(OffBrush, null, offGroup));
tmpDrawing.Children.Add(new GeometryDrawing(DisabledBrush, null, disabledGroup));
DisplayImage.Source = new DrawingImage(tmpDrawing);

Для x = 128 и y = 8 он работает очень быстро, даже в системах Pentium III .

5
ответ дан 4 December 2019 в 23:06
поделиться

Даже если я немного опоздал: Этот пост Чарльза Петцольда очень помог в подобном сценарии.

2
ответ дан 4 December 2019 в 23:06
поделиться
Другие вопросы по тегам:

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