0

我正在用 C# 开发类似 CAD 的应用程序(表单,没有外部框架)。我已经实现了平移、缩放、选择;但它很慢,因为每次鼠标移动都会重绘所有线条。

如何构建更快、更高效的应用程序?如何只重画一条线?

绘图代码(在标准面板上):

void pan_Paint(object sender, PaintEventArgs e)
{
    foreach (Entitie o in sketch.Entities)
    {
        if (o is Line)
        {
            Line l = (Line)o;
            Point p1 = pointScreen(l.P1.X.CurrentValue, l.P1.Y.CurrentValue);
            Point p2 = pointScreen(l.P2.X.CurrentValue, l.P2.Y.CurrentValue);
            e.Graphics.DrawLine(Pens.Black, p1, p2);
        }
    }
}

绘制新线:

void pan_MouseMove(object sender, MouseEventArgs e)
{
    if (tmpEntitie != null)
    {
        Line l = (Line)tmpEntitie;
        l.P2 = e.Location;
        pan.Invalidate();
    }
}
4

2 回答 2

0

假设你这样做是为了学习东西:你已经有了第一步的答案——你已经确定了什么需要很长时间以及什么时候需要(“每一个鼠标移动它都会重画所有线条”)。下一步是在“我可以做得更快”之前“我需要做我正在做的任何事情吗”。您可能不需要在鼠标移动时重新绘制所有内容 - 尝试测量,看看它是否适合您。以 1000 次/秒的速度重绘所有内容需要很长时间,但与 60 次/秒(甚至更少)的速度没有明显不同。

如果你发现自己在“我能不能做得更快”——定义你的目标并首先衡量你有什么。如果您想坚持基本的,请搜索“双缓冲”,考虑适当的 3d 框架 DirectX/XNA 或 OpenGL,看看 WPF 是否适合您。

于 2012-03-02T00:02:07.313 回答
0

我认为您需要使用空间分区技术,将空间划分为区域或象限,并且仅当对象位于当前视口中显示的区域中时才重绘对象。

以下是一些开始的链接:

http://en.wikipedia.org/wiki/Space_partitioning

http://en.wikipedia.org/wiki/Quadtree

图书馆:

http://www.vividsolutions.com/jts/jtshome.htm(Java拓扑套件)

http://code.google.com/p/nettopologysuite/(C#中的 JTS)

于 2012-08-23T20:43:03.570 回答