Я щелкнул бы проблемой: не ограничивайте петлю временами N за секунду. Вместо этого процесс N единицы работы равномерно распределяется за желаемое время.
Таким образом, вычислите, сколько времени прошло начиная с начало (или предыдущая работа ), интерполируйте это в , производительность и делает так много работы (фактор во время начала/в предыдущий раз и объем работы, который был сделан). Это - фундаментальное подкрепление многих двигателей игры/анимации - a "время дельты".
Тогда звоните урожай
в конце каждой петли, чтобы "быть хорошим" - или скорее предотвратить еду 99% + использование центрального процессора! У самого урожая есть минимальное разрешение <глоток> 1 , но эффекты обычно соответствуют, особенно интерполируя соответственно.
Поскольку подход интерполяции используется, это должно работать на весь N (что может пробег в выделенное время), даже если это означает делать еще много N каждая петля. Также возможно, что никакая работа не могла бы быть сделана никакая конкретная петля для маленького N, но , урожай
делает этот вид "дополнительного занятого перекручивания" дешевым с точки зрения загрузки ЦП <глоток> 2 .
Вот некоторый псевдокод, чтобы распечатать 20 "x" s за секунду, куда теперь
возвращает доли секунды:
rate = 20 //per second - "N times per second"
done = 0
goal = 1 * rate//same as rate for 1 second
start = now()
while done < goal:
target = floor((now() - start) * rate)
work = (target - done)//work might be 0, that's okay
for 0 upto work:
print("x")
done += work
yield()
В этом случае легко интерполировать прочь времени начала из-за постоянной формулы уровня. Используя "время дельты", базирующееся от времени, так как, последняя работа (или петля) подобна и подходит, когда нет никакой дискретной формулы, но не немного более сложна и может привести к тонким ошибкам дрейфа.
1 The time resolution of an actual sleep/yield
is implementation-dependent and varies by by system. For instance, it might range from as low as 1ms on Linux to 10-15ms on windows.
2 In addition to dealing with a time delta, the sleep
period can be altered, as per Dariusz Wawer's answer. However, this adds complexity and a simple yield
is often sufficient.