最近,我切换到DrawingVisuals
以提高趋势图(尤其是缩放和平移)的性能。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行)绘制,但是当我打开位图缓存时,图形的某些部分有时会变得模糊。
有谁知道我怎么能解决这个问题?我尝试更改DrawingVisual
的RenderAtScale
或关闭EdgeMode
设置,但这没有帮助。
编辑:遗漏了刷子填充几何图形以避免混淆,因为它在这里不相关。
您正在使用'BitmapCache'(请参阅[my](http://stackoverflow.com/q/25507861/1997232)问题),它看起来像使用jpg-compession的位图。也许你可以实现自己的'BitmapCache'(这不会是一个JPG)?顺便说一句,要有一个非常高性能的图表,我必须在wpf中使用'GDI +'。 – Sinatr 2014-10-01 09:42:57
你有没有使用GDI +的例子,我将如何从代码示例开始呢? – 2014-10-01 09:48:25