优化CAD应用程序以提高效率

时间:2012-03-01 23:43:12

标签: c# performance cad

我正在开发像C#中的应用程序(表单,没有外部框架)。我已经实现了pan,zoom,select;但它很慢,因为在每次鼠标移动时它都会重绘所有线条。

如何构建应用程序以更快,更高效?如何重绘一行?

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

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();
    }
}

2 个答案:

答案 0 :(得分:0)

假设你这样做是为了学习东西:你已经有了第一步的答案 - 你已经确定了需要很长时间和什么时候(“每个鼠标移动它重绘所有行”)。下一步是“我能做什么,我需要做什么”之前“我能做得更快”。您可能不需要在鼠标移动时重绘所有内容 - 尝试并测量,看看它是否足够好。重新绘制所有内容1000次/秒需要很长时间,但与60次/秒(甚至更少)相比不会明显不同。

如果你发现自己“我可以更快地做到” - 定义你的目标并衡量你的第一个目标。如果你想坚持使用基本的,请考虑“双缓冲”,考虑适当的3D框架DirectX / XNA或OpenGL,看看WPF是否适合你。

答案 1 :(得分: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)