鼠标移动会减慢游戏速度
本文关键字:游戏 速度 移动 鼠标 | 更新日期: 2023-09-27 18:15:54
我正在开发一款带有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();
}
}
您可能在mouse_move处理程序中做了太多的工作。既然你没有提供代码,这是我能提供的最好的建议。
你必须小心你在这样的处理程序中所做的事情。当拖动鼠标时,鼠标移动会被触发很多次。在那种情况下,你应该尽量少做。
如果你发布你的代码,我们可以进一步帮助,但在那之前,我们没有足够的信息来给你一个坚实的修复
编辑:现在你已经发布了代码,我看到你在每个鼠标移动事件中调用Invalidate()
。你不断地重新绘制整个形式。这么频繁地表演,工作量太大了。你需要对你重画的东西更聪明一点。
第一步尝试只使需要重新绘制的区域无效。这应该会有很大帮助。Invalidate()
将接受Rectangle
作为参数,使用它。
也许不要在每次事件触发时都运行代码。可以将其限制为每隔5次事件触发或每100毫秒运行一次代码。
嗯,有很多原因会导致这种情况的发生,如果不看代码,很难判断是哪一个原因。
最常见的原因是事件处理程序接管了执行并导致所有事情都等待它。解决方案通常意味着让你的代码更高效。