Это нормально для игры использовать 100% CPU?

23

Я только что реализовал многопотоковую обработку ввода в своем игровом движке, где код, опрашивающий ОС, чтобы собрать входные данные и метки времени, находится в отдельном потоке, и каждый кадр в основном потоке я просто поглощаю собранный ввод до логическое игровое время. Все работает, но эта настройка использует 100% моего процессора. У меня два ядра, и он работает до 100% при запуске моей игры.

Я проверил с другими играми, чтобы увидеть, делают ли они это тоже. Например Skyrim и Doom 3, кажется, хорошо с чуть более 60% процессора.

Приемлемо ли для игры, использующей многопоточный ввод, использовать процессор на 100%? Если нет, то какие уловки используют такие игры, чтобы снизить использование процессора потоком ввода?

Легкая искра
источник
7
Итак, что вы говорите, у вас в основном есть поток с бесконечным циклом while, который постоянно опрашивает ОС на наличие новых событий? while true do CheckForEvents;
Кромстер говорит, что поддерживает Монику
5
Если приложение использует 100% процессорного времени независимо от использования и скорости процессора, то это можно по праву считать ошибкой. Вы не должны использовать больше процессорного времени, чем необходимо для визуализации кадра за цикл обновления монитора.
Касперд
3
@TheLightSpark Нить опроса даже не спит? Если вы постоянно зацикливаетесь и проверяете без сна, вы, вероятно, съедаете намного больше процессорного времени, чем необходимо.
Люк
3
Re @Luke: Даже спящий всего лишь миллисекунду между опросами резко сократит использование процессора. Некоторое время назад я написал графический интерфейс для инструмента командной строки, который взял входной файл и сделал выходной файл примерно того же размера. Чтобы оценить процент, я прочитал размер файла выходного файла и обновил индикатор выполнения (используя while (true)). Использовал 90% + одного процессора для этого. При добавлении Thread.Sleep(5)к нему загрузка процессора снизилась до 40%. Переход к 25 миллисекундам между опросами привел к снижению до 10%.
Коул Джонсон
2
@AlecTeal Я думаю, вы не обратили достаточного внимания на то, что я сказал. Рендеринг более качественной графики - это не то же самое использование, и, конечно, использование более качественной графики увеличит потребление процессора. Но если переключение на более быстрый процессор приведет к тому, что ваш код будет просто тратить больше циклов, производя точно такой же результат, ваш код имеет недостатки. Автоматическое измерение того, какое качество графики может быть отображено на конкретном процессоре, является разумным значением по умолчанию. Но вы должны позволить пользователям выбирать, если они работают от батареи или также требуют ЦП для фоновых заданий.
Касперд

Ответы:

41

Да, это нормально для игры в реальном времени, когда вы пытаетесь использовать 100% CPU, чтобы работать как можно быстрее и лучше. Таким образом, игрок видит столько кадров в секунду, либо физическую симуляцию или что-то еще, что может обеспечить его компьютер.

В вашем случае - Нет, это выглядит как неэффективный дизайн, чтобы взять поток и заставить его опрашивать события в цикле ( while true do CheckForEvents;). Поправьте меня, если я не прав, но ОС уже опрашивает события. Вы должны просто проверять их в своей основной ветке один раз за каждый тик.

Основной игровой цикл должен быть достаточно быстрым, чтобы работать со скоростью 30+ тиков в секунду, чего вполне достаточно для опроса команд во многих играх. Игрок не увидит разницы, если его команды будут обработаны, например, через 0-33мс. С другой стороны, вы могли бы использовать это дополнительное ядро ​​процессора для более полезных задач, таких как НАМНОГО лучше ИИ или физика или что-то еще.

PS Как просили уточнить в комментариях, не принимайте вышеприведенные цифры вслепую для всех видов игр. В то время как для игры TBS может потребоваться всего 1 тик за ход, а для игры RTS - 10 тиков в ход, другим жанрам, таким как RaceSim, нужно гораздо больше. И, конечно, не связывайте логические тики с частотой кадров, это две разные вещи.

Кромстер говорит, что поддерживает Монику
источник
5
Я бы поднял этот вопрос, но потом вижу, что вы рекомендуете 30 тиков в секунду. ИМХО (и многие другие игроки), вы должны стремиться к 60 тикам (и, следовательно, 60 кадрам) в секунду. 60 FPS для многих людей выглядит более плавно, играет более отзывчиво и с меньшей вероятностью даст определенную группу пользователей укачивания.
Nzall
4
Задержка на входе в 33мс очень заметна ...
Synxis
1
@NateKerkhofs: я пришел из RTS, где обычно 10 тиков. Это широкий мир, я добавлю подробности об этом. Спасибо за указание.
Кромстер говорит, что поддерживает Монику
1
@KromStern: я не могу говорить за Нейта полностью, но третий абзац можно интерпретировать как «30 Гц должен быть вашей целью», хотя его также можно интерпретировать как «30 Гц - это минимум, который вы можете терпеть» (что может означать то, что вы имели в виду) ).
Шон Миддледич
1
Использование 100% CPU - ужасная практика. Вы перебиваете пользователей ноутбуков для вещей, которые никоим образом, форме или форме не должны использовать 100% CPU. Запишите правильный игровой цикл, который может эффективно подавать кадры на монитор.
Крис Деннетт
9

Игра с постоянным обновлением активного окна в основном запускается в полноэкранном режиме и является единственной (большой) программой машины, управляемой ОС. Таким образом, вполне допустимо использовать 100% процессорного времени, потому что больше ничего не нужно.

Однако это не означает, что вы всегда должны использовать 100% независимо от состояния вашей игры. Большинство игровых циклов используют метод сна в качестве разделителя частоты кадров, если они закончили рендеринг кадра до предела частоты кадров, чтобы процессор не использовался даром.
Это, вероятно, то, что происходит в ваших примерах: ваша машина работает быстрее, чем нужно Skyrim или Doom 3, поэтому они используют только то, что им нужно - но все то, что им нужно.

Как сказал @KromSterm, ОС обычно уже опрашивает вас за события, поэтому нет необходимости делать цикл быстрее, чем цикл ОС. Если у вас есть только два ядра, использовать 100% второго только для обнаружения событий не очень хорошая идея, потому что если вы передаете события только в основной цикл обновления, он выполняется очень быстро. Вместо этого вы должны попытаться использовать это ядро ​​для части основного потока работы с другим потоком.

Aracthor
источник
«использовать метод сна» - правильно ли я считаю, что это называется ограничителем частоты кадров?
Гусдор
3
режим сна не является точным методом ограничения кадра, если цель состоит в том, чтобы ограничить количество кадров для отслеживания частоты обновления, то лучше использовать аппаратную поддержку vsync (или g-sync от nvidia, если доступно)
Sarge Borsch
8

Есть несколько недостатков, связанных с использованием всего доступного процессорного времени в ПК или мобильной игре.

Системные требования: если в игру можно играть на ПК, на котором вы разрабатываете игру, она может не воспроизводиться на более слабом ПК, принадлежащем тому, кто купил вашу игру. Ограничение использования ЦП позволит использовать игру на машинах, которые, вероятно, появятся у большего количества людей. Если вы действительно хотите увидеть, ограничиваете ли вы свой рынок, протестируйте свои компьютерные игры и игры своих конкурентов на съемном устройстве Atom, например, Transformer Book, или протестируйте свои мобильные игры на недорогом предоплаченном телефоне Android.

Энергопотребление. Портативный компьютер разряжает батарею быстрее, когда четыре ядра используются на 100% полной частоты, чем, скажем, два ядра используются на 60% половинной частоты. Поэтому убедитесь, что ваш поток опроса контроллера, AI-поток, физический поток и графический поток заблокированы, пока не пришло время для их повторного запуска. За исключением нескольких очень дурацких жанров, таких как бой и ритм, вам не нужно опрашивать контроллеры быстрее, чем примерно 60 Гц, поэтому настройте поток опроса на работу с таймером 60 Гц.

Изменчивость физики: если физика, которая влияет на игровой процесс, более подробно описана на более сильных машинах, то одно и то же действие игрока будет иметь разные результаты на разных машинах. Это означает, что игрок может обманывать, используя более сильную или более слабую машину. Id's Quake III Arena славится тем, что частота кадров влияет на высоту прыжка . Чтобы избежать этого, многие игры используют фиксированный временной шаг для физики. Но это не влияет на физику, которая не связана с игровым процессом, например, эффекты частиц или ткани, или интерполяция координат между кадрами физики для рендеринга видео с более высокой частотой кадров, чем физика. Так что разработайте свою физику, используя какой-то вариант модель-представление-контроллер архитектура, в которой в модель включаются важные вещи (ускорение, обнаружение попаданий и т. п.), а в поле зрения - настраиваемая конфетка.

Изменчивость ИИ: Если ИИ более детализирован на более сильных машинах, враги будут вести себя по-разному на разных машинах. Например, в реализации «Го» или «Шахматы» оппонент будет слабее на более слабом ПК, и игроки могут обманывать, играя в игру на более слабом ПК или запуская фоновые процессы, такие как антивирус или транскодирование видео или обновления операционной системы.

Дамиан Йеррик
источник
4
+1 за использование силы. Тем более, что вы должны учитывать мобильную и планшетную индустрию, где это чрезвычайно важно.
akaltar
1
Энергопотребление также влияет на шум даже на настольных ПК. Современные настольные компьютеры обычно работают медленно и тихо, когда система холодная. Также, возможно, пользователь кодирует видео (с низким приоритетом) во время воспроизведения, поэтому любое свободное время процессора не теряется. Или для потоковой передачи плеера, оставляя больше циклов для кодирования видео, это большое дело и обеспечивает более высокое качество видео. (Видеокодирование - это трехсторонний компромисс между временем процессора, битрейтом и качеством, поэтому большее время процессора означает кодирование в реальном времени с более высоким качеством при той же скорости передачи битов.)
Питер Кордес
1
Потребление энергии должно быть основным соображением, все остальные соображения вторичны, ИМХО. Единственное, для чего я бы использовал 100% CPU (если бы это действительно помогло!), Это VR.
Крис Деннетт