WPF DrawingVisual производительность на некоторых машинах

Я разрабатываю приложение, которое должно рисовать около 70 тыс. Прямоугольников в виде сетки (одна сетка 40x250 и одна 250x250). Не все прямоугольники будут видны на экране в то время.

После прочтения http://msdn.microsoft.com/en-us/magazine/dd483292.aspx я создал простой элемент управления (наследует от FrameworkElement, детали перечислены ниже), который использует DrawingVisual descant для создания одного столбца прямоугольников.

// Removing items after collection change
private void RemoveItems(IList oldItems) {
    foreach (var oldItem in oldItems) {
        var visualChild = _visuals.FirstOrDefault(v => v.Data == oldItem);
        if (visualChild != null) {
            _visuals.Remove(visualChild);
            RemoveVisualChild(visualChild);
        }

        _translateTransform.X -= 8;
    }
}

// Adding items after collection change
private void AddItems(IList newItems) {
    foreach (var newItem in newItems) {
        var newArray = (byte[]) newItem;
        var visual = CreateVisual(newArray);
        _visuals.Add(visual);
        AddVisualChild(visual);
        _col++;
    }

}

// Creating visual element
private StripeVisual CreateVisual(byte[] data) {
    var result = new StripeVisual {
        Data = data,
        Transform = _translateTransform
    };

    using (var dc = result.RenderOpen()) {
        for (int i = 0; i < data.Length; i++) {
            dc.DrawRectangle(_brushes[data[i]], _strokePen, new Rect(_col * 8, i * 20, 8, 20));
        }
    }

    return result;
}

Все кисти заморожены (члены Brushes класс) и _strokePen замерз. Новая вертикальная полоса добавляется в коллекцию каждые 200 мс.

Программа была запущена на 3 компьютерах:

  1. Ноутбук: i7-2670QM, GeForce GT 540M/Intel HD Graphics 3000, 4 ГБ ОЗУ, Win7 x64, DirectX11,
  2. ПК: Core2Duo E7400, Radeon HD 4800, 3 ГБ ОЗУ, Win7 x64, DirectX11,
  3. ПК: i3 3,07 ГГц, Inter HD Graphics, 3,3 ГБ ОЗУ, Win7 x86, DirectX11.

Проблема в том, что на моем первом компьютере программа работает без сбоев и не сильно влияет на процессор (загрузка составляет 1-10%). Как на втором, так и на третьем компьютерах производительность программ недопустима: при сетке размером около 30x100 она занимает до 50% процессора, и все работает очень медленно. Программа работает медленно, даже когда видна только небольшая часть сетки.

Похоже, что программа использует рендеринг программного обеспечения (поток рендеринга использует 50% процессора), но RenderCapability.Tier >> 16 возвращает 2 и RenderOption.ProcessRenderMode установлен в Default, Также нет ключа в [HKCU/Software/Microsoft/Avalon.Graphics] это отключило бы аппаратное ускорение.

Возможно ли запустить это приложение на гладко перечисленных компьютерах? Что еще я могу сделать, чтобы максимизировать производительность этой программы?

Обновить

настройка DrawingVisual.CacheMode = new BitmapCache(); очень помог. Означает ли это, что узкополосным узлом является связь между процессором и графическим процессором

0 ответов

Другие вопросы по тегам