我正在开发一个具有mouse_move事件的太空入侵者游戏。它有效,但当我移动鼠标时,一切都变慢了。入侵者和其他东西停止移动,直到你停止移动鼠标
有人可以解释为什么以及可以采取哪些措施来解决这个问题。
感谢名单
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
Cursor.Dispose();
objsp.gsPos = new Point(MousePosition.X / 2 - 10, MousePosition.Y / 2 - 15);
UpdatePosition(objsp.gsPos.X, objsp.gsPos.Y, objsp.gsImage);
}
private void UpdatePosition(int dx, int dy, Image img)
{
Point newPos = new Point(objsp.gsPos.X + dx, objsp.gsPos.Y + dy);
//dont go out of window boundary
newPos.X = Math.Max(0, Math.Min(ClientSize.Width - img.Width, newPos.X));
newPos.Y = Math.Max(0, Math.Min(ClientSize.Height - img.Height, newPos.Y));
if (newPos != objsp.gsPos)
{
objsp.gsPos = newPos;
Invalidate();
}
}
答案 0 :(得分:3)
你可能在mouse_move处理程序中做了太多工作。由于您没有提供我能提供的最佳建议的代码。
你必须小心你在这样的处理程序中做什么。拖动鼠标时,鼠标移动会被激活很多次。你应该尽可能少地做那件事。
如果您发布代码我们可以提供更多帮助,但在此之前我们没有足够的信息为您提供可靠的解决方案
编辑:
现在您已经发布了我看到您在每次鼠标移动事件中调用Invalidate()
的代码。你不断重画整个表格。这通常需要做很多工作。您需要对重绘的内容更加智能化。
尝试仅将需要重绘的区域作为第一步进行无效。这应该对事情有显着帮助。 Invalidate()
将接受Rectangle
作为参数,使用它。
答案 1 :(得分:0)
也许尽量不在每次事件触发时运行代码。也许限制它只在每第5次事件发生时运行代码或每100ms运行一次。
答案 2 :(得分:0)
嗯,有很多原因导致这种情况发生,如果没有看到代码,就很难分辨出它可能是什么。
最常见的原因是事件处理程序正在接管执行并导致所有内容等待它。解决方案通常意味着使您的代码更有效。