Наскоро преминах към 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 линии), но когато включа кеширането на растерни изображения, части от графиката понякога се размазват.
Някой знае ли как мога да поправя това? Опитах да променя RenderAtScale
на DrawingVisual
или да изключа настройката EdgeMode
, но това не помага.
РЕДАКТИРАНЕ: Изоставете геометрията на запълване на четката, за да избегнете объркване, тъй като тя не е подходяща тук.
BitmapCache
(вижте моя въпрос), който изглежда като растерно изображение, използващо jpg-компресия. Може би можете да внедрите собственBitmapCache
(който няма да бъде jpg)? Между другото, за да имам графика с наистина висока производителност, трябваше да използвамGDI+
в wpf. - person Sinatr   schedule 01.10.2014