c# - 当我打开 STEAM 时,乒乓球游戏运行得更快 - 为什么?

标签 c# multithreading

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

我的问题是为什么当我打开 Steam 时程序运行得更快 :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);
        }
    }

最佳答案

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

参见 this question了解如何在您的应用程序中执行此操作。

关于c# - 当我打开 STEAM 时,乒乓球游戏运行得更快 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16489334/

相关文章:

c# - VSO API Work Item PATCH 给出 400 Bad Request

c# - 使用 vNext 在 Entity Framework 7 中未添加导航属性

c - 解锁时向多个线程发出信号的一把锁

c - 为什么只有 2 个线程处于事件状态时 pthread_create() 会失败?

c# - Java 线程创建性能 vs C# 线程创建性能 vs C++( native 线程)?

java - 安卓 : Get data in real-time instead of using Async-Task

java线程同步-这不应该工作,但它是:) -

c# - C# 中的 WebRTC STUN 和 TURN 服务器

c# - 如何使用 C# 和 Json.NET 解析 Google 的 JSON API 搜索结果?

c# - 在数据透视表无法削减并且数据来自许多地方的情况下,如何自动化地按计划进行报告?