Я определенно немного запутался с новой библиотекой C++ chrono.
Здесь у меня есть цикл обновления. Он выполняет две операции:
engine.Update()
engine.Render()
Это длительные операции, и трудно сказать, насколько они длительны.
Таким образом, мы измеряем, сколько времени они заняли, затем делаем некоторые расчеты и определяем лучший способ постепенного вызова обновления перед вызовом рендеринга.
Для этого я использую функциональность C++11 Chrono. Я выбрал его, потому что это звучало как хорошая сделка: более точная, более зависимая от платформы. Я обнаружил, что у меня больше проблем, чем сейчас.
Ниже приведен мой код, а также моя основная проблема. Очень нужна любая помощь по проблеме или правильному способу выполнения моих операций!
Я отметил свои вопросы в комментариях непосредственно рядом с обсуждаемыми строками, которые я повторю ниже.
Заголовочный файл:
class MyClass
{
private:
typedef std::chrono::high_resolution_clock Clock;
Clock::time_point mLastEndTime;
milliseconds mDeltaTime;
}
Упрощенный цикл обновления
// time it took last loop
milliseconds frameTime;
// The highest we'll let that time go. 60 fps = 1/60, and in milliseconds, * 1000
const milliseconds kMaxDeltatime((int)((1.0f / 60.0f) * 1000.0f)); // It's hard to tell, but this seems to come out to some tiny number, not what I expected!
while (true)
{
// How long did the last update take?
frameTime = duration_cast<milliseconds>(Clock::now() - mLastEndTime); // Is this the best way to get the delta time, with a duration cast?
// Mark the last update time
mLastEndTime = Clock::now();
// Don't update everything with the frameTime, keep it below our maximum fps.
while (frameTime.count() > 0) // Is this the best way to measure greater than 0 milliseconds?
{
// Determine the minimum time. Our frametime, or the max delta time?
mDeltaTime = min(frameTime, kMaxDeltatime);
// Update our engine.
engine->Update((long)mDeltaTime.count()); // From here, it's so much easier to deal with code in longs. Is this the best way to shove a long through my code?
// Subtract the delta time out of the total update time
frameTime -= mDeltaTime;
}
engine->Render();
}
Главный вопрос: мой mDeltaTime всегда выходит крошечным. По сути, он застрял в почти бесконечном цикле. Это потому, что kMaxDeltatime очень мал, но если я нацелен на 60 кадров в секунду, разве я не рассчитал правильные миллисекунды?
Вот все вопросы, перечисленные выше:
const milliseconds kMaxDeltatime((int)((1.0f / 60.0f) * 1000.0f)); // It's hard to tell, but this seems to come out to some tiny number, not what I expected!
frameTime = duration_cast<milliseconds>(Clock::now() - mLastEndTime); // Is this the best way to get the delta time, with a duration cast?
while (frameTime.count() > 0) // Is this the best way to measure greater than 0 milliseconds?
engine->Update((long)mDeltaTime.count()); // From here, it's so much easier to deal with code in longs. Is this the best way to shove a long through my code?
Извините за путаницу, ребята. Я чувствую себя идиотом с этой хронографической библиотекой. Большинство справочных сайтов, справочных материалов или даже самого прямого кода очень сложно читать и понимать, к чему я его применяю. Указания на то, как я должен искать решения или код, очень приветствуются!
РЕДАКТИРОВАТЬ: Иоахим указал, что std::min/max отлично работает в миллисекундах! Обновлен код, чтобы отразить изменения.
min
/max
для времен, то для них легко создать простые перегруженные функции. - person Some programmer dude   schedule 09.02.2013std::min
или < a href="http://en.cppreference.com/w/cpp/algorithm/max" rel="nofollow noreferrer">std::max
? Они созданы по шаблону, поэтому должны работать, если есть подходящая перегрузка оператора<
. Вы можете использовать варианты, которые позволяют вам передать свою собственную функцию сравнения. - person Some programmer dude   schedule 09.02.2013