【问题标题】:Optimizing CAD application to be more efficient优化 CAD 应用程序以提高效率
【发布时间】:2012-08-24 04:57:22
【问题描述】:

我正在用 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();
    }
}

【问题讨论】:

  • 不使用 C#?考虑到即使是最基本的应用程序所涉及的库,您对绘图所做的大多数事情都将是潜在的。另外,如果您还没有,我建议您查看 OpenTK 之类的内容
  • 你能展示你的代码吗?此外,.NET 对图形的处理非常好,所以即使每次鼠标移动都重绘,如果每次只重绘变化的区域也不会有问题。
  • .NET 对于大多数图形应用程序来说是非常快的,如果你使用得当的话。提示:一遍又一遍地调用 SetPixel 不是你想要的方式:-)
  • 将您的问题标记为 C# 并不足以解释您在做什么。我们至少需要知道您是否在使用 Forms、WPF 或其他一些框架,以便能够提出有意义的建议。

标签: c# performance cad


【解决方案1】:

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

以下是一些开始的链接:

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)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这是我的第一个绘图应用程序,所以我想学习 CAD 和矢量应用程序背后的基本理论。双缓冲看起来是个不错的建议。
    猜你喜欢
    • 2012-04-26
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    相关资源
    最近更新 更多