Игра pingpong работает быстрее, когда я открываю STEAM - почему?

Я начинаю программировать в С#, и я просто играю в пинг-понг. Я использую нити - один для столкновения, один для перемещения, один для рисования.

Мой вопрос в том, почему программа работает быстрее, когда я открываю пар: D мне кажется глупостью. Замедление медленнее, я имею в виду - мяч медленнее и подушки тоже. Похоже, процессор ленив, чтобы сделать работу или что-то в этом роде. Это происходит в реальном времени - я открываю игру, она медленная, я открываю пар, это быстрее, а затем я закрываю пар, и он медленный снова.

Моя первая мысль заключалась в том, что это потому, что двойная видеокарта, но использующая карту nvidia, не помогает.

Другая ситуация: я открываю игру - медленный, открытый скайп - игра быстрее, скайп загружен - игра медленная, закрытие скайпа - игра быстрая, закрытая скайп - игра медленная..

Как заставить игру использовать процессор всегда одинаково?

мой код я move метод

    public void move()
    {
        DelegateSetScore d = new DelegateSetScore(SetScore);

        while (!isDisposing)
        {
            pad1.Y = pad1.Y + 4 * pad1Down + 4 * pad1Up;
            if (pad1.Y < 0) { pad1.Y = 0; }
            if (pad1.Y + pad1.Height > HEIGHT) { pad1.Y = HEIGHT - pad1.Height; }

            pad2.Y = pad2.Y + 4 * pad2Down + 4 * pad2Up;
            if (pad2.Y < 0) { pad2.Y = 0; }
            if (pad2.Y + pad2.Height > HEIGHT) { pad2.Y = HEIGHT - pad2.Height; }

            ball.X = ball.X + 6 * ballXDirection;
            ball.Y = ball.Y + 2 * ballYDirection;

Вот еще один код о столкновении с границами и подсчете очков... и он и с waitevent.

            waitevent.WaitOne(5);

Я предполагаю, что это происходит из-за автоматического разгона процессора, но я новичок..: D

Вот все в одном потоке

    public void bigthread()
    {

        DelegateSetScore d = new DelegateSetScore(SetScore);

        while (!isDisposing)
        {
            //move

            pad1.Y = pad1.Y + 4 * pad1Down + 4 * pad1Up;
            if (pad1.Y < 0) { pad1.Y = 0; }
            if (pad1.Y + pad1.Height > HEIGHT) { pad1.Y = HEIGHT - pad1.Height; }

            pad2.Y = pad2.Y + 4 * pad2Down + 4 * pad2Up;
            if (pad2.Y < 0) { pad2.Y = 0; }
            if (pad2.Y + pad2.Height > HEIGHT) { pad2.Y = HEIGHT - pad2.Height; }

            ball.X = ball.X + 6 * ballXDirection;
            ball.Y = ball.Y + 2 * ballYDirection;

            if (ball.X < 0)
            {
                ballXDirection = 1;
                intScorePlayer2++;
                this.BeginInvoke(d, intScorePlayer2, 2);
            }

            if (ball.X + ball.Width > WIDTH)
            {
                ballXDirection = -1;
                intScorePlayer1++;
                this.BeginInvoke(d, intScorePlayer1, 1);
            }

            if (ball.Y < 0)
            {
                ballYDirection = 1;
            }

            if (ball.Y + ball.Height > HEIGHT)
            {
                ballYDirection = -1;
            }

            //collision

            if ((pad1.X + pad1.Width > ball.X) && (ball.X + ball.Width > pad1.X))
                if ((pad1.Y + pad1.Height > ball.Y) && (ball.Y + ball.Height > pad1.Y))
                {
                    ballXDirection = 1;
                    if (pad1Down == 1) { ballYDirection = 1; }
                    if (pad1Up == -1) { ballYDirection = -1; }
                }

            if ((pad2.X + pad2.Width > ball.X) && (ball.X + ball.Width > pad2.X))
                if ((pad2.Y + pad2.Height > ball.Y) && (ball.Y + ball.Height > pad2.Y))
                {
                    ballXDirection = -1;
                    if (pad2Down == 1) { ballYDirection = 1; }
                    if (pad2Up == -1) { ballYDirection = -1; }
                }

            //paint - platno is graphics from picturebox
            Platno.Clear(Color.Black);
            Platno.FillRectangle(Brushes.Orange, pad1);
            Platno.FillRectangle(Brushes.Orange, pad2);
            Platno.FillRectangle(Brushes.Green, ball);

            waitevent.WaitOne(10);
        }
    }

Ответ 1

Это почти наверняка, потому что эти приложения чаще перепрограммируют прерывание таймера. По умолчанию проверка "Сон", "Ожидание" и "Переключение контекста" происходит через 10 или 15 миллисекундных интервалов, в зависимости от выпуска Windows, но это можно изменить, вызывая функцию API TimeBeginPeriod с аргументом 1 (один).

Смотрите этот вопрос, как это сделать в вашем приложении.

Ответ 2

Чтобы убедиться, что чувство игры/имитации не изменяется с доступностью CPU/GPU, скоростью рендеринга и т.д., вам нужно использовать прошедшее время для управления вещами, а не самого цикла. В образце кода, который у вас есть, я не вижу, что вы учитываете время, прошедшее с момента последнего выполнения. Таким образом, вы хотите, чтобы ваша скорость была функцией времени, например. 5 пикселей (дистанционные единицы сортировки)/сек. Затем в каждом исполнении вы вычисляете, сколько времени прошло с момента последнего запуска цикла, и включите, что на расстоянии вам нужно двигаться, умножив его на вашу скорость.

Еще одна вещь, которую вы должны сделать, - ограничить количество обновлений вашей игры. т.е. если рендер произошел меньше, чем X миллисекунд назад, то вы не будете рендерить, пока не пройдет определенное количество времени. Вы можете использовать целевой FPS и вычислить требуемое время. Например. если вы хотите ограничить ваше приложение до 40 FPS, то если ваш цикл рендеринга выполняется менее чем за 25 мс с момента последнего рендера, вы просто спите до 25 мс.

Использование времени в качестве руководства, а не выполнения циклов или фиксированных ожиданий, должно препятствовать вашей игре рендеринга быстрее или медленнее, независимо от того, что происходит в вашей системе. Конечно, если вы полностью из CPU/GPU, и рендеринг занимает слишком много времени, ваш FPS упадет до такой степени, что вы сможете увидеть медленность, но с игрой в клон-клон, вы действительно не должны доходить до этого.:)

Ответ 3

Возможно, это связано с тем, что ваш процессор переключает состояния питания. Попробуйте сохранить CPU-Z при открытии и закрытии приложения и Skype/Steam и наблюдать, что происходит с вашим процессором.