Я хотел бы рассчитать FPS последних 2-4 секунд игры. Как лучше всего это сделать?
Спасибо.
Редактировать: Чтобы быть более конкретным, у меня есть доступ только к таймеру с шагом в одну секунду.
Я хотел бы рассчитать FPS последних 2-4 секунд игры. Как лучше всего это сделать?
Спасибо.
Редактировать: Чтобы быть более конкретным, у меня есть доступ только к таймеру с шагом в одну секунду.
Почти пропустил совсем недавнюю публикацию. См. мой ответ об использовании экспоненциально взвешенных скользящих средних.
C++: подсчет общего количества кадров в игре
Вот пример кода.
Изначально:
avgFps = 1.0; // Initial value should be an estimate, but doesn't matter much.
Каждую секунду (при условии, что общее количество кадров за последнюю секунду равно framesThisSecond):
// Choose alpha depending on how fast or slow you want old averages to decay.
// 0.9 is usually a good choice.
avgFps = alpha * avgFps + (1.0 - alpha) * framesThisSecond;
Вот решение, которое может сработать для вас. Я напишу это на псевдо/C, но вы можете адаптировать эту идею к своему игровому движку.
const int trackedTime = 3000; // 3 seconds
int frameStartTime; // in milliseconds
int queueAggregate = 0;
queue<int> frameLengths;
void onFrameStart()
{
frameStartTime = getCurrentTime();
}
void onFrameEnd()
{
int frameLength = getCurrentTime() - frameStartTime;
frameLengths.enqueue(frameLength);
queueAggregate += frameLength;
while (queueAggregate > trackedTime)
{
int oldFrame = frameLengths.dequeue();
queueAggregate -= oldFrame;
}
setAverageFps(frameLength.count() / 3); // 3 seconds
}
Можно ли сохранить круговой буфер времени кадра для последних 100 кадров и усреднить их? Это будет «FPS для последних 100 кадров». (Или, скорее, 99, так как вы не будете различать самое новое время и самое старое.)
Назовите какое-то точное системное время, миллисекунды или лучше.
На самом деле вы хотите что-то вроде этого (в вашем mainLoop):
frames++;
if(time<secondsTimer()){
time = secondsTimer();
printf("Average FPS from the last 2 seconds: %d",(frames+lastFrames)/2);
lastFrames = frames;
frames = 0;
}
Если вы знаете, как работать со структурами/массивами, вам будет легко расширить этот пример, например, до 4 секунд вместо 2. Но если вам нужна более подробная помощь, вы должны действительно упомянуть, ПОЧЕМУ у вас нет доступа к точному таймер (какая архитектура, язык) - а то все как угадаешь...
Second. Так что я все еще могу считать количество кадров в секунду. Вот что значит ФПС. - person   schedule 14.01.2011