[client] app: correct FPS to use an actual per second value

This commit is contained in:
Geoffrey McRae 2021-07-19 10:58:40 +10:00
parent 2736e37e4a
commit 33bf668697
3 changed files with 44 additions and 25 deletions

View File

@ -691,12 +691,9 @@ bool app_renderImGui(void)
ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar
); );
const float fps = 1000.0f / (g_state.renderTimeTotal / igText("FPS:%4.2f UPS:%4.2f",
ringbuffer_getCount(g_state.renderTimings)); atomic_load_explicit(&g_state.fps, memory_order_relaxed),
const float ups = 1000.0f / (g_state.frameTimeTotal / atomic_load_explicit(&g_state.ups, memory_order_relaxed));
ringbuffer_getCount(g_state.frameTimings));
igText("FPS:%4.2f UPS:%4.2f", fps, ups);
igEnd(); igEnd();
} }

View File

@ -95,6 +95,26 @@ static void lgInit(void)
g_state.ds->showPointer(true); g_state.ds->showPointer(true);
} }
static bool fpsTimerFn(void * unused)
{
const float renderTime =
(float)atomic_exchange_explicit(&g_state.renderTime, 0,
memory_order_acquire);
const float fps = 1e9f / (renderTime /
(float)atomic_exchange_explicit(&g_state.renderCount, 0,
memory_order_acquire));
const float ups = 1e9f / (renderTime /
(float)atomic_exchange_explicit(&g_state.frameCount, 0,
memory_order_acquire));
atomic_store_explicit(&g_state.fps, fps, memory_order_relaxed);
atomic_store_explicit(&g_state.ups, ups, memory_order_relaxed);
return true;
}
static int renderThread(void * unused) static int renderThread(void * unused)
{ {
if (!g_state.lgr->render_startup(g_state.lgrData)) if (!g_state.lgr->render_startup(g_state.lgrData))
@ -106,6 +126,14 @@ static int renderThread(void * unused)
return 1; return 1;
} }
/* start up the fps timer */
LGTimer * fpsTimer;
if (!lgCreateTimer(1000, fpsTimerFn, NULL, &fpsTimer))
{
DEBUG_ERROR("Failed to create the fps timer");
return 1;
}
LG_LOCK_INIT(g_state.lgrLock); LG_LOCK_INIT(g_state.lgrLock);
/* signal to other threads that the renderer is ready */ /* signal to other threads that the renderer is ready */
@ -149,13 +177,15 @@ static int renderThread(void * unused)
const uint64_t t = nanotime(); const uint64_t t = nanotime();
const uint64_t delta = t - g_state.lastRenderTime; const uint64_t delta = t - g_state.lastRenderTime;
g_state.lastRenderTime = t; g_state.lastRenderTime = t;
atomic_fetch_add_explicit(&g_state.renderTime , delta, memory_order_relaxed);
atomic_fetch_add_explicit(&g_state.renderCount, 1 , memory_order_relaxed);
if (g_state.lastRenderTimeValid) if (g_state.lastRenderTimeValid)
{ {
const float fdelta = (float)delta / 1000000.0f; const float fdelta = (float)delta / 1e6f;
ringbuffer_push(g_state.renderTimings, &fdelta); ringbuffer_push(g_state.renderTimings, &fdelta);
g_state.renderTimeTotal += fdelta;
} }
g_state.lastRenderTimeValid = true; g_state.lastRenderTimeValid = true;
@ -177,6 +207,8 @@ static int renderThread(void * unused)
g_state.state = APP_STATE_SHUTDOWN; g_state.state = APP_STATE_SHUTDOWN;
lgTimerDestroy(fpsTimer);
if (t_cursor) if (t_cursor)
lgJoinThread(t_cursor, NULL); lgJoinThread(t_cursor, NULL);
@ -591,10 +623,10 @@ int main_frameThread(void * unused)
{ {
const float fdelta = (float)delta / 1000000.0f; const float fdelta = (float)delta / 1000000.0f;
ringbuffer_push(g_state.frameTimings, &fdelta); ringbuffer_push(g_state.frameTimings, &fdelta);
g_state.frameTimeTotal += fdelta;
} }
g_state.lastFrameTimeValid = true; g_state.lastFrameTimeValid = true;
atomic_fetch_add_explicit(&g_state.frameCount, 1, memory_order_relaxed);
lgSignalEvent(e_frame); lgSignalEvent(e_frame);
lgmpClientMessageDone(queue); lgmpClientMessageDone(queue);
} }
@ -679,13 +711,6 @@ static bool tryRenderer(const int index, const LG_RendererParams lgrParams,
return true; return true;
} }
static void rbSubtractFloat(void * value_, void * udata_)
{
float * value = (float *)value_;
float * udata = (float *)udata_;
*udata -= *value;
}
static int lg_run(void) static int lg_run(void)
{ {
memset(&g_state, 0, sizeof(g_state)); memset(&g_state, 0, sizeof(g_state));
@ -710,11 +735,6 @@ static int lg_run(void)
g_state.renderTimings = ringbuffer_new(256, sizeof(float)); g_state.renderTimings = ringbuffer_new(256, sizeof(float));
g_state.frameTimings = ringbuffer_new(256, sizeof(float)); g_state.frameTimings = ringbuffer_new(256, sizeof(float));
ringbuffer_setPreOverwriteFn(g_state.renderTimings, rbSubtractFloat,
&g_state.renderTimeTotal);
ringbuffer_setPreOverwriteFn(g_state.frameTimings , rbSubtractFloat,
&g_state.frameTimeTotal);
app_registerGraph("RENDER", g_state.renderTimings); app_registerGraph("RENDER", g_state.renderTimings);
app_registerGraph("UPLOAD", g_state.frameTimings); app_registerGraph("UPLOAD", g_state.frameTimings);

View File

@ -103,8 +103,10 @@ struct AppState
bool lastRenderTimeValid; bool lastRenderTimeValid;
RingBuffer renderTimings; RingBuffer renderTimings;
RingBuffer frameTimings; RingBuffer frameTimings;
float renderTimeTotal;
float frameTimeTotal; atomic_uint_least64_t renderTime;
atomic_uint_least64_t renderCount, frameCount;
_Atomic(float) fps, ups;
uint64_t resizeTimeout; uint64_t resizeTimeout;
bool resizeDone; bool resizeDone;