Консольное приложение C #: Console.Readkey () имеет странное начальное поведение пропуска на высоких частотах кадров - PullRequest
0 голосов
/ 26 октября 2018

Для вызова и получения образования я сейчас пытаюсь сделать простую игру в окне консоли .Я использую очень примитивную «заблокированную» систему частоты кадров как таковую:

 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

Я использую только клавишу А.Я держу это в течение некоторого времени, затем выпускаю это снова.GameSpeed установлен на 1000. Как и ожидалось, первые кадры дают низкие цифры, так как я мог бы начать вдавливать половину кадра, и то же самое с последними кадрами, поскольку я мог бы выпустить A раньше.

Теперь точно такой же эксперимент, но с GameSpeed ​​всего 200

Как вы можете видеть, я отметил места, на которые я начал нажимать, желтым цветом.Он всегда отлично получает первый кадр.Но тогда есть один, два или три кадра, где он действует так, как будто он получил никаких входных данных , но затем после этих кадров все в порядке и получает около 7 входных кадров на кадр.

Iпризнать, что вы не должны делать игры в окне консоли.Он не предназначен для подобных сценариев.Это, однако, не исключает возможности того, что есть какая-то конкретная логическая причина, по которой это происходит, и которую я мог бы исправить.Итак, конкретно вопрос заключается в следующем: Кто-нибудь может предоставить некоторые знания / идеи о том, почему это происходит?

Если нужны спецификации компьютера, просто скажите это в комментариях, и я добавлю их.

Редактировать : Я думаю, что нашел причину этой ошибки, и это клавиатура Windows задержка повторения .Хотя вы можете изменить это в панели управления, я искал в Интернете и не нашел примеров того, как вы могли бы изменить это в приложении ac #.Тогда вопрос сводится к следующему: как изменить задержку повторения клавиатуры Windows ?

...