【发布时间】:2014-11-26 02:25:13
【问题描述】:
最近我切换到DrawingVisuals 以提高趋势图的性能(尤其是缩放和平移)。
这是我的代码:
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 问题),它看起来像使用jpg-compression 的位图。也许您可以实现自己的BitmapCache(不会是jpg)?顺便说一句,要获得真正高性能的图表,我必须在 wpf 中使用GDI+。 -
您有使用 GDI+ 的示例,我将如何从我的代码示例开始?
标签: c# caching bitmap geometry drawingvisual