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 компьютерах:
- Ноутбук: i7-2670QM, GeForce GT 540M/Intel HD Graphics 3000, 4 ГБ ОЗУ, Win7 x64, DirectX11,
- ПК: Core2Duo E7400, Radeon HD 4800, 3 ГБ ОЗУ, Win7 x64, DirectX11,
- ПК: 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();
очень помог. Означает ли это, что узкополосным узлом является связь между процессором и графическим процессором