Ваша игра работает максимально быстро в одном ядре. Это нормально в зависимости от того, что вы сделали.
Я не знаю, хотите ли вы получить БОЛЬШУ мощность (таким образом, достичь 100%) или МЕНЬШЕ мощности (и использовать меньше из-за низкого расхода энергии пользователя ...)
Если вы хотите получить БОЛЬШЕ мощности, вам нужно как-то использовать многопоточность, чтобы использовать оба ядра. Поскольку я не сильно увлекаюсь потоками, я даже не буду пытаться объяснить, это совершенно не моя сфера.
Если вы хотите использовать МЕНЬШЕ питания, есть также два варианта ...
Одним из них является «выход», как называют его некоторые API-интерфейсы библиотек игр (например, Allegro), он состоит из создания счетчика FPS и передачи управления процессору каждому кадру на достаточное время. Например, если ваша игра хочет работать со скоростью 120 FPS, а вы хотите, чтобы она работала со скоростью 60, вы можете дать ему примерно столько же времени, сколько требуется для расчета фрейма (около 8,3333 ... мс).
Другой способ - использовать код на основе событий вместо кодирования. В этой форме вы помещаете свой код в функцию с именем «Update», которая принимает в качестве аргумента количество времени, прошедшее с момента последнего вызова (очень важно это ...). Это «обновление» может быть либо для всего приложения (более классического), либо для каждого объекта, имеющего свой собственный (популярный после изобретения Flash, который использует это, как «OnEnterFrame», также Unity и этот, и некоторые другие движки). И вы создаете код, который генерирует прерывание, и вызываете это обновление, обычно это просто таймер, который работает в обычное время (16,6 .... мс для 60FPS, 33,33333 ... мс для 30FPS).
Очевидно, что есть много других способов, но я не буду объяснять их все, потому что это достаточно информации для маленькой книги ...
Я сам использовал различные подходы, мне нравится просто использовать полную загрузку ЦП (без многопоточности) и использовать все больше и больше оскорбительных системных эффектов, когда доступно энергопотребление. Но для более простых игр я обычно делаю цикл, который «дает», самый простой способ, обычно подсчитывать, сколько времени потребовалось, чтобы вычислить все, вычесть это из 16,6 мс и вызвать функцию сна (которая дает контроль ОС на это время) на результат ... Например, если для вычисления кадра потребовалось 3 мс, я вызываю режим сна (16-3). И несколько движков заставляют меня работать с «стилем событий» (то есть: ввод поступает от прерываний клавиатуры, мыши и джойстика, а таймер прерывает и вызывает «Обновить (шаг)»), мне это не нравится, но мне пришлось учиться. ..
И последнее замечание: переменная «step», как я ее назвал (аргумент Update), обычно используется в математике логики игры, например: «position.x = position.x + speed * step» для создания объекта двигаться с фактической постоянной скоростью ... (очевидно, используемая операция зависит от того, какой "шаг" представляет).