10

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

我的问题是为什么程序运行得更快,当我打开蒸汽时:D 对我来说这似乎是无稽之谈。我的意思是女巫慢 - 球更慢,垫子也更慢。看起来处理器懒得做这项工作或类似的事情。这是实时发生的——我打开游戏,它很慢,我打开steam,它更快,然后我关闭steam,它又变慢了。

我的第一个想法是这是因为双显卡但使用 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);
        }
    }
4

3 回答 3

3

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

您应该做的另一件事是限制游戏执行的刷新次数。即,如果渲染发生的时间少于 X 毫秒,那么在经过一定时间之前您不会渲染。您可以使用目标 FPS 并从中计算所需的时间。例如,如果您想将您的应用程序限制为 40 FPS,那么如果您的渲染循环在自上次渲染后的 25 毫秒内执行,您只需休眠直到 25 毫秒过去。

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

于 2013-05-10T19:36:58.093 回答
3

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

请参阅此问题以了解如何在您的应用程序中执行此操作。

于 2013-05-10T20:47:53.680 回答
2

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

于 2013-05-10T19:33:26.827 回答