鼠标移动减慢游戏速度

时间:2011-11-26 21:02:55

标签: c# winforms

我正在开发一个具有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();
    }
}

3 个答案:

答案 0 :(得分:3)

你可能在mouse_move处理程序中做了太多工作。由于您没有提供我能提供的最佳建议的代码。

你必须小心你在这样的处理程序中做什么。拖动鼠标时,鼠标移动会被激活很多次。你应该尽可能少地做那件事。

如果您发布代码我们可以提供更多帮助,但在此之前我们没有足够的信息为您提供可靠的解决方案

编辑:

现在您已经发布了我看到您在每次鼠标移动事件中调用Invalidate()的代码。你不断重画整个表格。这通常需要做很多工作。您需要对重绘的内容更加智能化。

尝试仅将需要重绘的区域作为第一步进行无效。这应该对事情有显着帮助。 Invalidate()将接受Rectangle作为参数,使用它。

答案 1 :(得分:0)

也许尽量不在每次事件触发时运行代码。也许限制它只在每第5次事件发生时运行代码或每100ms运行一次。

答案 2 :(得分:0)

嗯,有很多原因导致这种情况发生,如果没有看到代码,就很难分辨出它可能是什么。

最常见的原因是事件处理程序正在接管执行并导致所有内容等待它。解决方案通常意味着使您的代码更有效。