C#控制台应用程序:Console.Readkey()在高帧率下具有奇怪的初始跳过行为

时间:2018-10-25 21:04:45

标签: c# input timer keyboard console-application

为了挑战和获得教育,我目前正在尝试在控制台窗口中制作一个简单的游戏 。我这样使用非常原始的“锁定”帧率系统:

 using System.Threading;

    // ... 

    static private void Main(string[] args)
    {
        AutoResetEvent autoEvent = new AutoResetEvent(false);
        Timer timer = new Timer(Update);
        timer.Change(0, GameSpeed);

        autoEvent.WaitOne();
    }

因此,计时器每隔GameSpeed毫秒进行一次滴答,并调用方法Update()

到目前为止,我了解控制台窗口中输入的方式如下: 控制台应用程序具有一个“队列”,其中将任何键盘输入存储为元数据和一个ConsoleKey枚举的实例。用户可以随时将其添加到此队列。如果用户按住,例如说A,它将在每个计算机框架上添加A。也就是说,计算机可以实际完成的最快数量,而不是我正在使用的锁定帧。

调用Console.Readkey()将删除并返回此列表中的第一个元素。 Console.KeyAvailable返回一个布尔值,指示列表是否为空。

如果GameSpeed设置为大于400的任何值,则表示一切正常。下图显示了一些Console.WriteLine()调试消息的结果,这些消息给出了使用以下代码在此锁定/自定义框架中检测到的键盘输入量:

int counter = 0;
            while (Console.KeyAvailable) { counter++; Console.ReadKey(true); }
            Console.WriteLine(counter);

Results

我只使用A键。我握了一段时间,然后再次释放。 GameSpeed设置为1000。正如预期的那样,前几帧的编号较低,因为我可能会开始将一半压入帧中,最后几帧也是如此,因为我可能会提前释放A。

Now, the exact same experiment but with a GameSpeed of only 200

如您所见,我用黄色标记了我开始按下的位置。它总是完美地获得第一帧。但是然后有一个,两个或三个帧,就好像没有输入任何信号,但是在这些帧之后就很好了,并且每帧获得大约7个输入。

我知道您不应该在控制台窗口中进行游戏。并非针对此类情况。但是,这并不能消除我可能能够解决的一些特定的,逻辑上的原因。因此,具体而言,问题是:任何人都可以提供一些有关为什么会发生这种情况的知识/想法吗?

如果需要计算机规格,请在评论中说出这些,然后我将其添加。

修改: 我想我已经找到了此错误的原因,这是Windows键盘重复延迟。虽然您可以在控制面板中更改此设置,但我在网上搜索并没有找到有关如何在c#应用程序中更改它的示例。然后问题归结为:如何更改Windows键盘重复延迟

0 个答案:

没有答案