mirror of
https://github.com/gnif/LookingGlass.git
synced 2024-12-22 22:01:46 +00:00
[client] app: correct FPS to use an actual per second value
This commit is contained in:
parent
2736e37e4a
commit
33bf668697
3 changed files with 44 additions and 25 deletions
|
@ -691,12 +691,9 @@ bool app_renderImGui(void)
|
|||
ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar
|
||||
);
|
||||
|
||||
const float fps = 1000.0f / (g_state.renderTimeTotal /
|
||||
ringbuffer_getCount(g_state.renderTimings));
|
||||
const float ups = 1000.0f / (g_state.frameTimeTotal /
|
||||
ringbuffer_getCount(g_state.frameTimings));
|
||||
|
||||
igText("FPS:%4.2f UPS:%4.2f", fps, ups);
|
||||
igText("FPS:%4.2f UPS:%4.2f",
|
||||
atomic_load_explicit(&g_state.fps, memory_order_relaxed),
|
||||
atomic_load_explicit(&g_state.ups, memory_order_relaxed));
|
||||
|
||||
igEnd();
|
||||
}
|
||||
|
|
|
@ -95,6 +95,26 @@ static void lgInit(void)
|
|||
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)
|
||||
{
|
||||
if (!g_state.lgr->render_startup(g_state.lgrData))
|
||||
|
@ -106,6 +126,14 @@ static int renderThread(void * unused)
|
|||
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);
|
||||
|
||||
/* signal to other threads that the renderer is ready */
|
||||
|
@ -147,15 +175,17 @@ static int renderThread(void * unused)
|
|||
}
|
||||
LG_UNLOCK(g_state.lgrLock);
|
||||
|
||||
const uint64_t t = nanotime();
|
||||
const uint64_t delta = t - g_state.lastRenderTime;
|
||||
const uint64_t t = nanotime();
|
||||
const uint64_t delta = t - g_state.lastRenderTime;
|
||||
|
||||
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)
|
||||
{
|
||||
const float fdelta = (float)delta / 1000000.0f;
|
||||
const float fdelta = (float)delta / 1e6f;
|
||||
ringbuffer_push(g_state.renderTimings, &fdelta);
|
||||
g_state.renderTimeTotal += fdelta;
|
||||
}
|
||||
g_state.lastRenderTimeValid = true;
|
||||
|
||||
|
@ -177,6 +207,8 @@ static int renderThread(void * unused)
|
|||
|
||||
g_state.state = APP_STATE_SHUTDOWN;
|
||||
|
||||
lgTimerDestroy(fpsTimer);
|
||||
|
||||
if (t_cursor)
|
||||
lgJoinThread(t_cursor, NULL);
|
||||
|
||||
|
@ -591,10 +623,10 @@ int main_frameThread(void * unused)
|
|||
{
|
||||
const float fdelta = (float)delta / 1000000.0f;
|
||||
ringbuffer_push(g_state.frameTimings, &fdelta);
|
||||
g_state.frameTimeTotal += fdelta;
|
||||
}
|
||||
g_state.lastFrameTimeValid = true;
|
||||
|
||||
atomic_fetch_add_explicit(&g_state.frameCount, 1, memory_order_relaxed);
|
||||
lgSignalEvent(e_frame);
|
||||
lgmpClientMessageDone(queue);
|
||||
}
|
||||
|
@ -679,13 +711,6 @@ static bool tryRenderer(const int index, const LG_RendererParams lgrParams,
|
|||
return true;
|
||||
}
|
||||
|
||||
static void rbSubtractFloat(void * value_, void * udata_)
|
||||
{
|
||||
float * value = (float *)value_;
|
||||
float * udata = (float *)udata_;
|
||||
*udata -= *value;
|
||||
}
|
||||
|
||||
static int lg_run(void)
|
||||
{
|
||||
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.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("UPLOAD", g_state.frameTimings);
|
||||
|
||||
|
|
|
@ -103,8 +103,10 @@ struct AppState
|
|||
bool lastRenderTimeValid;
|
||||
RingBuffer renderTimings;
|
||||
RingBuffer frameTimings;
|
||||
float renderTimeTotal;
|
||||
float frameTimeTotal;
|
||||
|
||||
atomic_uint_least64_t renderTime;
|
||||
atomic_uint_least64_t renderCount, frameCount;
|
||||
_Atomic(float) fps, ups;
|
||||
|
||||
uint64_t resizeTimeout;
|
||||
bool resizeDone;
|
||||
|
|
Loading…
Reference in a new issue