我正在开发像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();
}
}
答案 0 :(得分:0)
假设你这样做是为了学习东西:你已经有了第一步的答案 - 你已经确定了需要很长时间和什么时候(“每个鼠标移动它重绘所有行”)。下一步是“我能做什么,我需要做什么”之前“我能做得更快”。您可能不需要在鼠标移动时重绘所有内容 - 尝试并测量,看看它是否足够好。重新绘制所有内容1000次/秒需要很长时间,但与60次/秒(甚至更少)相比不会明显不同。
如果你发现自己“我可以更快地做到” - 定义你的目标并衡量你的第一个目标。如果你想坚持使用基本的,请考虑“双缓冲”,考虑适当的3D框架DirectX / XNA或OpenGL,看看WPF是否适合你。
答案 1 :(得分:0)
我认为您需要使用空间分区技术来划分区域或象限中的空间,并仅在对象位于当前视口中显示的区域时重绘对象。
以下是一些开始的链接:
http://en.wikipedia.org/wiki/Space_partitioning
http://en.wikipedia.org/wiki/Quadtree
库: