движение мыши замедляет игру - PullRequest
1 голос
/ 27 ноября 2011

Я занимаюсь разработкой космического захватчика, в котором есть событие mouse_move. это работает, но когда я двигаю мышь, все замедляется. захватчики и другие вещи перестают двигаться, пока вы не перестанете двигать мышью

Может кто-нибудь объяснить, почему и что можно сделать, чтобы решить эту проблему.

* 1005 спасибо *

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 ]

3 голосов
/ 27 ноября 2011

Вы, вероятно, выполняете слишком много работы в вашем обработчике mouse_move. Поскольку вы не предоставите код, это лучший совет, который я могу вам предложить.

Вы должны быть осторожны с тем, что делаете в таком обработчике. При перемещении мыши движение мыши будет происходить много-много раз. Вы должны сделать как можно меньше в этом случае.

Если вы опубликуете ваш код, мы поможем вам в дальнейшем, но до этого у нас не будет достаточно информации, чтобы дать вам твердое исправление

EDIT:

Теперь, когда вы отправили код, я вижу, вы звоните Invalidate() в каждое событие движения мыши . Вы постоянно перекрашиваете всю форму. Это большая работа, которую нужно выполнять так часто. Вы должны быть немного более умными в том, что вы перерисовываете.

Попробуйте сделать недействительной только область, которую необходимо перерисовать в качестве первого шага. Это должно заметно помочь вещам. Invalidate() примет Rectangle в качестве аргумента, используйте его.

0 голосов
/ 27 ноября 2011

Ну, есть множество причин, по которым это может произойти, и, не видя код, трудно сказать, каким он может быть.

Наиболее распространенная причина этого заключается в том, что обработчик событий принимаетнад исполнением и заставляя все ждать на нем.Решения обычно означают повышение эффективности вашего кода.

0 голосов
/ 27 ноября 2011

Возможно, старайтесь не запускать код каждый раз, когда происходит событие. Может быть, ограничить его запускать код только при каждом 5-м событии или каждые 100 мс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...