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

本文关键字:提高效率 应用程序 CAD 优化 | 更新日期: 2023-09-27 18:26:16

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

如何构建更快、更高效的应用程序?如何只重绘一行?

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

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

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

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

这里有一些链接可以开始:

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)

假设你这样做是为了学习东西:你已经知道了第一步的答案——你已经确定了什么需要很长时间,什么时候需要("每次鼠标移动都会重新绘制所有线条")。下一步是"我需要做我正在做的任何事情吗",然后是"我能做得更快吗"。你可能不需要在鼠标移动时重新绘制所有内容——试着测量一下,看看它是否足够好。每秒重新绘制1000次将需要很长时间,但与每秒绘制60次(甚至更少)没有明显区别。

如果你发现自己在"我能做得更快吗"——首先定义你的目标并衡量你的目标。搜索"双缓冲"如果你想坚持基本,考虑合适的三维框架DirectX/XNA或OpenGL,看看WPF是否适合你。