Недавно я переключился на DrawingVisuals
, чтобы увеличить производительность наших трендовых графиков (особенно масштабирование и панорамирование).Кэш Bitmap на DrawingVisual имеет размытые части
Вот код, у меня есть:
blocksToBeRendered = (baseItem as AvgCurve).GetStreamGeometryBlocks(ActualWidth, ActualHeight, _minPoint.X, _maxPoint.X, FixTimeStep ? _timeStep : 0, IsMainChart);
Pen stroke = new Pen((baseItem as AvgCurve).LineBrush, 1);
foreach (GeometryGroup group in blocksToBeRendered)
{
if (group.Children.Count != 0)
{
if (!cachedBlocks[baseItem].Any(x => x.Children[0] == group.Children[0]))
{
cachedBlocks[baseItem].Add(group);
ImprovedDrawingVisual vis = new ImprovedDrawingVisual();
BitmapCache cache = new BitmapCache() { SnapsToDevicePixels = true };
vis.CacheMode = cache;
using (DrawingContext context = vis.RenderOpen())
{
RenderOptions.SetEdgeMode(group, EdgeMode.Aliased);
if (group.Children.Count > 0)
{
context.DrawGeometry(null, stroke, group.Children[0]);
}
}
_host.VisualCollection.Add(vis);
}
}
}
Это ImprovedDrawingVisual
:
public class ImprovedDrawingVisual: DrawingVisual
{
public ImprovedDrawingVisual()
{
VisualEdgeMode = EdgeMode.Aliased;
VisualBitmapScalingMode = BitmapScalingMode.NearestNeighbor;
}
}
Теперь геометрия действительно есть Transforms
, что может быть важно.
Что происходит, так это то, что графики рисуются красиво без кэширования растровых изображений (1 px строк), но когда я включаю кеширование растрового изображения, части графика иногда размываются.
Кто-нибудь знает, как я могу это исправить? Я попытался изменить RenderAtScale
DrawingVisual
или отключить настройку EdgeMode
, но это не поможет.
EDIT: Оставьте геометрию кисти, чтобы избежать путаницы, поскольку она здесь не имеет отношения.
Вы используете 'BitmapCache' (см. [Мой] (http://stackoverflow.com/q/25507861/1997232) вопрос), который выглядит как растровое изображение с использованием jpg-compession. Возможно, вы можете реализовать собственный «BitmapCache» (который не будет jpg)? Btw, чтобы иметь действительно высокопроизводительный график, мне пришлось использовать 'GDI +' в wpf. – Sinatr
У вас есть пример использования GDI +, как бы я это сделал, начиная с моего примера кода? –