В моих первых предложениях вам нужно будет хранить время запуска алгоритма и счетчик, так что всего два значения.
Составьте фиксированное расписание.Каждому событию будет назначено определенное время, которое определяется непосредственно временем начала алгоритма, количеством событий с тех пор и требуемой скоростью:
event_time = start_time + event_counter / rate
После каждого события увеличивайтеevent_counter
и спать до тех пор, пока не наступит event_time
следующего события (sleep(event_time - current_time)
или аналогичное).
В моем втором предложении вам также потребуется сохранить длительность задержки, поэтому у вас будет трисохраняемые значения.
После каждого события спите до тех пор, пока не наступит задержка, и переходите к следующему событию.Также после каждого события (или просто если counter % n == 0
сделать это только после n событий) вы обновляете задержку: используя текущее время, время начала и счетчик, вы вычисляете текущую среднюю скорость;если оно слишком высокое, вы увеличиваете задержку;если оно слишком мало, вы уменьшаете задержку;в противном случае вы оставляете задержку без изменений.
Это автоматически определит среднюю задержку, необходимую для вашего типа события и скорости.Однако, если ваши события сильно различаются по продолжительности, у вас будут проблемы с плавностью.В худшем случае (с определенным изменением длительности) вы можете даже получить резонансные эффекты периодического увеличения и уменьшения задержек.