Да, это возможно сделать в одном потоке. Вообще говоря, вы хотите обновлять объекты каждый кадр, а не только когда есть свободные циклы. Ваша анимация и движение будут отключены от частоты кадров и выглядят довольно изменчиво, если вы этого не сделаете. Если вы говорите больше об обновлениях ИИ или о чем-то еще, что не должно быть в режиме реального времени, я бы поставил на это таймер. Вы должны знать, какова ваша целевая частота кадров, и время простоя будет тем, что осталось после того, как все остальное будет выполнено.
Допустим, вы выбрали 60 FPS для своей игры. Таким образом, у вас остается 16,667 мс для выполнения всей работы, необходимой для каждого кадра. В начале игры получите текущее время, используя таймер с самым высоким разрешением, добавьте 16,667 мс и сохраните его где-нибудь. Я думаю, что функция в Python - это time (), хотя прошло уже много времени с тех пор, как я работал на языке. После завершения обработки введите цикл, который сравнивает текущее время с временем, которое вы записали. Если текущее время меньше времени окончания кадра, update_a_very_small_amount. Я бы не стал сильно беспокоиться о том, что обработка проходит после конца фрейма, поскольку ваше небольшое обновление должно быть быстрым для обработки. Это будет лишь небольшая задержка начала следующего кадра, и у вас будет достаточно времени для его обработки.
После того как кадр завершил обработку, добавьте 16,667 мс ко времени, которое было сохранено для конца последнего кадра, чтобы выяснить, где должен быть конец следующего кадра. Если вы используете текущее время + 16,667 мс, и обработка завершается, конец следующего кадра будет вытеснен на то же время, что и последний кадр.
Re: Второй Править
Чтобы уточнить, я использую термин частота кадров здесь, чтобы указать одну итерацию по основному циклу. Если это основано на скорости ввода пользователя, я полагаю, что ваша цель состоит в том, чтобы просто заставить игру чувствовать себя отзывчивой. В противном случае вы можете просто проверить ввод и обновлять все каждый раз через цикл, даже если для этого требуется 10 секунд. Чтобы он чувствовал себя отзывчивым, вы, вероятно, захотите проверять ввод примерно 20 раз в секунду, что дает эффективную частоту кадров 20 кадров в секунду, даже если вы на самом деле не рисуете эти кадры. Это даст вам 50 мсек для обновления, прежде чем вам снова понадобится проверить ввод.