打开STEAM时pingpong游戏运行得更快 - 为什么?

时间:2013-05-10 19:15:44

标签: c# multithreading

我是c#编程的初学者,我只是在打乒乓球游戏。我正在使用线程 - 一个用于碰撞,一个用于移动,一个用于绘制。

我的问题是为什么程序运行得更快,当我打开蒸汽时:D对我来说这似乎是一个废话。我的意思更慢 - 球更慢,垫也是。看起来处理器懒得去做这样的工作。这是实时发生的 - 我打开游戏,它很慢,我打开蒸汽,它更快,然后我关闭蒸汽,它再次缓慢。

我的第一个想法是,因为双显卡却让它使用nvidia卡无济于事。

另一种情况:我打开游戏 - 慢,打开Skype - 游戏速度更快,Skype加载 - 游戏速度慢,关闭Skype - 游戏速度快,关闭Skype - 游戏速度慢......

如何使游戏始终使用处理器?

我的代码我移动方法是

    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);
        }
    }

3 个答案:

答案 0 :(得分:3)

为了确保游戏/模拟感觉不随CPU / GPU可用性,渲染速度等而变化,您需要使用经过的时间来控制事物,而不是循环本身。在您拥有的代码示例中,我没有看到您考虑自上次执行以来经过的时间。所以你希望你的速度是时间的函数,例如5个像素(距离单位)/秒。然后在每次执行中,您计算​​自上次执行循环以来经过的时间,并将其与您需要移动的距离相乘,并将其与您的速度相乘。

您应该做的另一件事是限制游戏执行的刷新次数。即如果渲染发生的时间少于X毫秒,那么在经过一定时间后才会渲染。您可以使用目标FPS并计算所需的时间。例如。如果你想把你的应用限制在40 FPS,那么如果你的渲染循环在上一次渲染后的不到25ms内执行,你只需要睡到25ms。

使用时间作为指导,而不是循环执行或固定等待应该可以防止游戏更快或更慢地渲染,无论系统上发生了什么。当然,如果你完全没有CPU / GPU并且渲染时间太长,那么你的FPS会降到你可以看到缓慢的程度,但是使用pong-clone游戏,你真的不应该达到这一点。 :)

答案 1 :(得分:3)

这几乎可以肯定,因为这些应用程序会更频繁地重新编程定时器中断。默认情况下,Sleep,等待和上下文切换检查以10或15毫秒的间隔发生,具体取决于Windows版本,但可以通过调用参数为1(一)的timeBeginPeriod API函数来更改,例如。

请参阅this question了解如何在您的应用中执行此操作。

答案 2 :(得分:2)

可能是因为您的处理器会切换电源状态。在打开和关闭应用程序以及Skype / Steam时,请尝试保持CPU-Z处于打开状态,并观察处理器发生的情况。