当前位置:  开发笔记 > 编程语言 > 正文

WPF DrawingBrush性能

如何解决《WPFDrawingBrush性能》经验,为你挑选了1个好方法。

我需要在画布的背景上绘制网格线,并在其上放置其他控件.

我尝试创建一个StreamGeometry,使用它绘制线条,并将其分配给DrawingBrush.但是我发现,如果StreamGeometry有太多行,则在将DrawingBrush分配给Canvas后,程序会变得迟缓.

无论如何都有"预渲染"网格线并将其分配给Canvas?

我尝试Freeze()了刷子和几何,但似乎没有用.我还有其他选择吗?

这是我的代码:

public void RenderGrid()
{
    this.UpdateGrid();
    Pen grid_pen = new Pen(Brushes.Blue, 0.1);
    StreamGeometry sg = new StreamGeometry();

    DrawingBrush b = new DrawingBrush();
    GeometryDrawing gd = new GeometryDrawing();
    gd.Geometry = sg;
    gd.Pen = grid_pen;
    b.Drawing = gd;

    StreamGeometryContext ctx = sg.Open();
    foreach (double d in this.VerticalGrids)
    {

        ctx.BeginFigure(new Point(d, 0), true, false);
        ctx.LineTo(new Point(d, this.RenderSize.Height), true,false);
    }
    foreach (double d in this.HorizontalGrids)
    {

        ctx.BeginFigure(new Point(0, d), true, false);
        ctx.LineTo(new Point(this.RenderSize.Width, d),true, false);
    }
    ctx.Close();
    sg.Freeze();
    gd.Freeze();

    b.Freeze();
    this.Background = b;
}

小智.. 6

我的建议是保持原始数量下降.您正在使WPF花费CPU周期和带宽创建并将大量网格发送到渲染线程和GPU.

DrawingBrush是一个TileBrush.

将一个网格单元绘制到DrawingImage上,并使用TileMode,Viewbox和Viewport属性来平铺网格.



1> 小智..:

我的建议是保持原始数量下降.您正在使WPF花费CPU周期和带宽创建并将大量网格发送到渲染线程和GPU.

DrawingBrush是一个TileBrush.

将一个网格单元绘制到DrawingImage上,并使用TileMode,Viewbox和Viewport属性来平铺网格.

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有