Задать вопрос
@lambakean

Как можно оптимизировать работу с итератором цикла в моем случае?

Здравствуйте, я для интереса пишу небольшую 2D игру, в процессе работы появился вопрос.
На игровом поле должна спавниться еда, которую едят юниты.
В игре есть основной цикл - бесконечный, который прерывается лишь при закрытии игрового окна. Одна итерация цикла проходит раз в 1/20 секунды, то есть в игре 20 ФПС. Мне нужно, чтобы раз в 25 кадров на игровом поле спавнилась еда. Точнее, мне это не нужно, я это уже сделал, но сделал я это с помощью остатка от деления итератора на 25. На Python'е это i%25. Каждый раз при выполнении цикла проверяется остаток от деления итератора на 25, и если этот остаток равен нулю - пора спавнить еду.
Так вот, можно ли каким-нибудь образом оптимизировать это? Может быть, конкретно у языка Python есть для этого какие-нибудь инструменты? Возможно, искать остаток от деления 20 раз в секунду это не очень хорошее решение, учитывая то, что у меня есть несколько видов еды, каждый из которых спавнится на поле с разным промежутком времени, для каждого вида приходится вот так вот искать остаток.
  • Вопрос задан
  • 92 просмотра
Подписаться 2 Простой Комментировать
Решения вопроса 1
twobomb
@twobomb
Искать остаток от деления 20 раз в секунду это незаметная мелочь. Но у меня вопрос другой, почему вы не сделали спаун еды по времени и почему всего 20 фпс?
А если у меня очень слабый компуктер и выдает всего 10фпс, то играя в вашу игру я буду получать еды меньше чем другие в два раза...
Обычно как делается, есть переменная deltaTime, можете сами ее высчитывать. Это время прошедшее с последнего кадра, до этого (1 итерация). В идеале в вашей игре это 0,05, но если игра зависнет на 2 секунды то оно будет равно 2.
Так вот, желательно бы делать движения, спаун еды и все остальное относительно этого времени.
То есть создаем переменную, типа buffSpawnFoodTime. Прибавляем каждую итерацию к ней deltaTime.
К примеру спаун еды идет каждые 1,5 секунды. Количество спаунов еды на этой итерации равно
count = int(buffSpawnFoodTime/ 1.5)
buffSpawnFoodTime -= int(buffSpawnFoodTime/ 1.5) * 1.5

В таком случае если игра зависнет на 6 секунд, то после развисания произойдет положенные 4 раздачи еды.
И вообще зависимость игры от фпс это очень не хорошо.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы