Для вызова и получения образования я сейчас пытаюсь сделать простую игру в окне консоли .Я использую очень примитивную «заблокированную» систему частоты кадров как таковую:
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 ?