优化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();
}
}
我认为您需要使用空间分区技术,将空间划分为区域或象限,只有当对象位于当前视口中显示的区域中时,才重新绘制对象。
这里有一些链接可以开始:
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是否适合你。