Я только что реализовал многопотоковую обработку ввода в своем игровом движке, где код, опрашивающий ОС, чтобы собрать входные данные и метки времени, находится в отдельном потоке, и каждый кадр в основном потоке я просто поглощаю собранный ввод до логическое игровое время. Все работает, но эта настройка использует 100% моего процессора. У меня два ядра, и он работает до 100% при запуске моей игры.
Я проверил с другими играми, чтобы увидеть, делают ли они это тоже. Например Skyrim и Doom 3, кажется, хорошо с чуть более 60% процессора.
Приемлемо ли для игры, использующей многопоточный ввод, использовать процессор на 100%? Если нет, то какие уловки используют такие игры, чтобы снизить использование процессора потоком ввода?
c++
performance
input
multithreading
cpu
Легкая искра
источник
источник
while true do CheckForEvents;
while (true)
). Использовал 90% + одного процессора для этого. При добавленииThread.Sleep(5)
к нему загрузка процессора снизилась до 40%. Переход к 25 миллисекундам между опросами привел к снижению до 10%.Ответы:
Да, это нормально для игры в реальном времени, когда вы пытаетесь использовать 100% CPU, чтобы работать как можно быстрее и лучше. Таким образом, игрок видит столько кадров в секунду, либо физическую симуляцию или что-то еще, что может обеспечить его компьютер.
В вашем случае - Нет, это выглядит как неэффективный дизайн, чтобы взять поток и заставить его опрашивать события в цикле (
while true do CheckForEvents;
). Поправьте меня, если я не прав, но ОС уже опрашивает события. Вы должны просто проверять их в своей основной ветке один раз за каждый тик.Основной игровой цикл должен быть достаточно быстрым, чтобы работать со скоростью 30+ тиков в секунду, чего вполне достаточно для опроса команд во многих играх. Игрок не увидит разницы, если его команды будут обработаны, например, через 0-33мс. С другой стороны, вы могли бы использовать это дополнительное ядро процессора для более полезных задач, таких как НАМНОГО лучше ИИ или физика или что-то еще.
PS Как просили уточнить в комментариях, не принимайте вышеприведенные цифры вслепую для всех видов игр. В то время как для игры TBS может потребоваться всего 1 тик за ход, а для игры RTS - 10 тиков в ход, другим жанрам, таким как RaceSim, нужно гораздо больше. И, конечно, не связывайте логические тики с частотой кадров, это две разные вещи.
источник
Игра с постоянным обновлением активного окна в основном запускается в полноэкранном режиме и является единственной (большой) программой машины, управляемой ОС. Таким образом, вполне допустимо использовать 100% процессорного времени, потому что больше ничего не нужно.
Однако это не означает, что вы всегда должны использовать 100% независимо от состояния вашей игры. Большинство игровых циклов используют метод сна в качестве разделителя частоты кадров, если они закончили рендеринг кадра до предела частоты кадров, чтобы процессор не использовался даром.
Это, вероятно, то, что происходит в ваших примерах: ваша машина работает быстрее, чем нужно Skyrim или Doom 3, поэтому они используют только то, что им нужно - но все то, что им нужно.
Как сказал @KromSterm, ОС обычно уже опрашивает вас за события, поэтому нет необходимости делать цикл быстрее, чем цикл ОС. Если у вас есть только два ядра, использовать 100% второго только для обнаружения событий не очень хорошая идея, потому что если вы передаете события только в основной цикл обновления, он выполняется очень быстро. Вместо этого вы должны попытаться использовать это ядро для части основного потока работы с другим потоком.
источник
Есть несколько недостатков, связанных с использованием всего доступного процессорного времени в ПК или мобильной игре.
Системные требования: если в игру можно играть на ПК, на котором вы разрабатываете игру, она может не воспроизводиться на более слабом ПК, принадлежащем тому, кто купил вашу игру. Ограничение использования ЦП позволит использовать игру на машинах, которые, вероятно, появятся у большего количества людей. Если вы действительно хотите увидеть, ограничиваете ли вы свой рынок, протестируйте свои компьютерные игры и игры своих конкурентов на съемном устройстве Atom, например, Transformer Book, или протестируйте свои мобильные игры на недорогом предоплаченном телефоне Android.
Энергопотребление. Портативный компьютер разряжает батарею быстрее, когда четыре ядра используются на 100% полной частоты, чем, скажем, два ядра используются на 60% половинной частоты. Поэтому убедитесь, что ваш поток опроса контроллера, AI-поток, физический поток и графический поток заблокированы, пока не пришло время для их повторного запуска. За исключением нескольких очень дурацких жанров, таких как бой и ритм, вам не нужно опрашивать контроллеры быстрее, чем примерно 60 Гц, поэтому настройте поток опроса на работу с таймером 60 Гц.
Изменчивость физики: если физика, которая влияет на игровой процесс, более подробно описана на более сильных машинах, то одно и то же действие игрока будет иметь разные результаты на разных машинах. Это означает, что игрок может обманывать, используя более сильную или более слабую машину. Id's Quake III Arena славится тем, что частота кадров влияет на высоту прыжка . Чтобы избежать этого, многие игры используют фиксированный временной шаг для физики. Но это не влияет на физику, которая не связана с игровым процессом, например, эффекты частиц или ткани, или интерполяция координат между кадрами физики для рендеринга видео с более высокой частотой кадров, чем физика. Так что разработайте свою физику, используя какой-то вариант модель-представление-контроллер архитектура, в которой в модель включаются важные вещи (ускорение, обнаружение попаданий и т. п.), а в поле зрения - настраиваемая конфетка.
Изменчивость ИИ: Если ИИ более детализирован на более сильных машинах, враги будут вести себя по-разному на разных машинах. Например, в реализации «Го» или «Шахматы» оппонент будет слабее на более слабом ПК, и игроки могут обманывать, играя в игру на более слабом ПК или запуская фоновые процессы, такие как антивирус или транскодирование видео или обновления операционной системы.
источник