首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DrawingContext.DrawLine性能问题

DrawingContext.DrawLine性能问题
EN

Stack Overflow用户
提问于 2011-05-09 21:12:43
回答 6查看 4.8K关注 0票数 6

我正在尝试不同的策略来绘制从控件的左边缘到右边缘的图形。到目前为止,我们使用的是画布和折线,它执行得很好,但仍然可以使用一些改进。

当我尝试DrawingContext.DrawLine时,我体验到了令人难以置信的糟糕性能,我不知道为什么。这是我能想到的最简洁的代码,用来演示这个问题:

代码语言:javascript
复制
public class TestControl : Control {

    static Pen pen = new Pen(Brushes.Gray, 1.0);
    static Random rnd = new Random();

    protected override void OnRender(DrawingContext drawingContext) {

        var previousPoint = new Point(0, 0);

        for (int x = 4; x < this.ActualWidth; x += 4) {
            var newPoint = new Point(x, rnd.Next((int)this.ActualHeight));
            drawingContext.DrawLine(pen, previousPoint, newPoint);
            previousPoint = newPoint;
        }
    }
}

而MainWindow.xaml只包含以下内容:

代码语言:javascript
复制
<StackPanel>
    <l:TestControl Height="16"/>
    <!-- copy+paste the above line a few times -->
</StackPanel>

现在调整窗口大小:根据StackPanel中的调试器数量,我遇到了明显的延迟(10个控件)或30秒的完全停顿(100个控件),其中我甚至无法在VS...中点击“停止调试器”-Button。

我对此很困惑,显然我做错了什么,但由于代码如此简单,我看不出这是什么……我使用的是.Net4,以防万一。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-05-10 15:26:15

您可以通过冻结画笔来获得性能。

代码语言:javascript
复制
static TestControl()
{
    pen.Freeze();
}
票数 8
EN

Stack Overflow用户

发布于 2011-05-09 23:14:43

在WPF中绘制图形最有效的方法是使用DrawingVisual。

Charles Petzold在MSDN Magazine上写了一篇出色的文章,解释了如何做到这一点:

Foundations: Writing More Efficient ItmesControls

这些技术适用于显示数千个数据点。

票数 1
EN

Stack Overflow用户

发布于 2011-05-10 15:24:40

好了,再多玩一下,我发现冻结这支笔有很大的影响。现在我在构造函数中创建画笔,如下所示:

代码语言:javascript
复制
public TestControl() {
    if (pen == null) {
        pen = new Pen(Brushes.Gray, 1.0);
        pen.Freeze();
    }
}

现在的表现和我预期的一样。我知道它必须是简单的..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5937364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档