У меня есть симуляция, которую я пытаюсь преобразовать в «реальное время». Я говорю «в реальном времени», потому что это нормально для производительности, чтобы окунуться в случае необходимости (время замедления для наблюдателей и клиентов). Однако, если есть небольшое количество объектов, я хочу ограничить производительность, чтобы она работала с постоянной частотой кадров (в этом случае ~ 100 FPS).Эффективное ограничение рамки
Я попытался sleep()
и Sleep()
для Linux и Windows, соответственно, но это, кажется, не достаточно точны, как FPS действительно провалов на долю того, что я стремился. Я предполагаю, что этот сценарий распространен для игр, особенно онлайн-игр, но я не смог найти полезный материал по этому вопросу. Каков предпочтительный способ ограничения кадров? Есть ли метод сна, который может гарантировать, что он не откажется от времени больше, чем указано?
Примечание: Я запускаю это на двух разных кластерах (linux и windows), и все узлы имеют только встроенное видео. Поэтому я должен реализовать ограничение на обеих платформах, и он не должен основываться на видеокарте (если есть такая вещь). Мне также нужно реализовать ограничение только на одном потоке/узле, потому что уже существует синхронизация между узлами, а остальные будут автоматически ограничены, если один поток будет правильно ограничен.
Edit: некоторые псевдо-код, который показывает, как я реализовал ограничитель тока:
while (ProcessControlMessages())
{
uint64 tStart;
SimulateFrame();
uint64 newT =_context.GetTimeMs64();
if (newT - tStart < DESIRED_FRAME_RATE_DURATION)
this_thread::sleep_for(chrono::milliseconds(DESIRED_FRAME_RATE_DURATION - (newT - tStart)));
}
Я также думал, если я мог бы сделать ограничение каждые N кадров, где N представляет собой часть требуемой частоты кадров. Я попробую и отправлю отчет.
Какова ваша мера приемлемого джиттера? –
+ -20% должно быть хорошо. Это не должно быть очень точным, я просто не хочу, чтобы FPS проходила над крышей, когда объектов меньше. Это нормально было бы хорошо, но теперь я предоставляю ввод для другого моделирования, и результаты становятся непредсказуемыми, когда я имитирую тысячи кадров в секунду. Они не должны быть тесно синхронизированы, но должны оставаться в разумных пределах. – Mel