Browse Source

Add a recording mode to Ticker that ensures fixed deltatime even when

lagging behind.
legacy
Sam Hocevar sam 14 years ago
parent
commit
eec2eb7a9a
3 changed files with 31 additions and 14 deletions
  1. +4
    -0
      src/debugrecord.cpp
  2. +25
    -14
      src/ticker.cpp
  3. +2
    -0
      src/ticker.h

+ 4
- 0
src/debugrecord.cpp View File

@@ -45,6 +45,8 @@ private:
DebugRecord::DebugRecord(char const *path, float fps)
: data(new DebugRecordData())
{
Ticker::StartRecording();

data->path = strdup(path);
data->width = 0;
data->height = 0;
@@ -96,5 +98,7 @@ void DebugRecord::TickDraw(float deltams)

DebugRecord::~DebugRecord()
{
Ticker::StopRecording();

delete data;
}

+ 25
- 14
src/ticker.cpp View File

@@ -30,7 +30,7 @@ public:
TickerData() :
todolist(0), autolist(0),
nentities(0),
frame(0), benchmark(0), deltams(0), bias(0), fps(0),
frame(0), benchmark(0), recording(0), deltams(0), bias(0), fps(0),
quit(0), quitframe(0), quitdelay(20), panic(0)
{
for (int i = 0; i < Entity::ALLGROUP_END; i++)
@@ -61,7 +61,7 @@ private:
int nentities;

/* Fixed framerate management */
int frame, benchmark;
int frame, benchmark, recording;
Timer timer;
float deltams, bias, fps;

@@ -168,7 +168,7 @@ void Ticker::TickGame()

data->frame++;

if (data->benchmark && data->fps)
if (data->recording && data->fps)
{
data->deltams = 1000.0f / data->fps;
}
@@ -324,20 +324,21 @@ void Ticker::ClampFps()
{
Profiler::Stop(Profiler::STAT_TICK_BLIT);

if (data->benchmark)
/* If benchmarking, set wait time to 0. If FPS are fixed, force wait
* time to 1/FPS. Otherwise, set wait time to 0. */
float framems = (!data->benchmark && data->fps) ? 1000.0f / data->fps
: 0.0f;

if (!data->benchmark)
{
data->bias = 0.0f;
if (framems > data->bias + 200.0f)
framems = data->bias + 200.0f; // Don't go below 5 fps
if (framems > data->bias)
data->timer.WaitMs(framems - data->bias);
}
else
{
float deltams = data->fps ? 1000.0f / data->fps : 0.0f;

if (deltams > data->bias + 200.0f)
deltams = data->bias + 200.0f; // Don't go below 5 fps
if (deltams > data->bias)
data->timer.WaitMs(deltams - data->bias);
data->bias -= deltams;
}
if (!data->recording)
data->bias -= framems;
}

void Ticker::StartBenchmark()
@@ -350,6 +351,16 @@ void Ticker::StopBenchmark()
data->benchmark--;
}

void Ticker::StartRecording()
{
data->recording++;
}

void Ticker::StopRecording()
{
data->recording--;
}

int Ticker::GetFrameNum()
{
return data->frame;


+ 2
- 0
src/ticker.h View File

@@ -34,6 +34,8 @@ public:
static void ClampFps();
static void StartBenchmark();
static void StopBenchmark();
static void StartRecording();
static void StopRecording();
static int GetFrameNum();

static void Shutdown();


Loading…
Cancel
Save