From 8e3484f88f7a7739de53f2b18b7b006430e2430a Mon Sep 17 00:00:00 2001 From: Jason Newcomb Date: Tue, 22 Nov 2022 10:09:55 -0500 Subject: [PATCH] Fix percision lost when calculating the frame time. Started after ~4 minutes due to float percision limits, would be visible after ~18-36 hours when it would be off by 4-8ms. --- src/d2dx/RenderContext.cpp | 4 ++-- src/d2dx/RenderContext.h | 2 +- src/d2dx/Utils.cpp | 10 +++++++--- src/d2dx/Utils.h | 3 ++- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/d2dx/RenderContext.cpp b/src/d2dx/RenderContext.cpp index 9beb040..6a9366e 100644 --- a/src/d2dx/RenderContext.cpp +++ b/src/d2dx/RenderContext.cpp @@ -468,8 +468,8 @@ void RenderContext::Present() break; } - double curTime = TimeEndMs(_timeStart); - _frameTimeMs = curTime - _prevTime; + auto curTime = TimeEnd(_timeStart); + _frameTimeMs = TimeToMs(curTime - _prevTime); _prevTime = curTime; if (_deviceContext1) diff --git a/src/d2dx/RenderContext.h b/src/d2dx/RenderContext.h index cc1b919..28af694 100644 --- a/src/d2dx/RenderContext.h +++ b/src/d2dx/RenderContext.h @@ -211,7 +211,7 @@ namespace d2dx int64_t _timeStart; bool _hasAdjustedWindowPlacement = false; - double _prevTime; + int64_t _prevTime; double _frameTimeMs; }; } \ No newline at end of file diff --git a/src/d2dx/Utils.cpp b/src/d2dx/Utils.cpp index c1f55f7..648c44b 100644 --- a/src/d2dx/Utils.cpp +++ b/src/d2dx/Utils.cpp @@ -51,13 +51,17 @@ int64_t d2dx::TimeStart() return (int64_t)li.QuadPart; } -float d2dx::TimeEndMs(int64_t sinceThisTime) +int64_t d2dx::TimeEnd(int64_t sinceThisTime) { - warmup(); LARGE_INTEGER li; QueryPerformanceCounter(&li); + return li.QuadPart - sinceThisTime; +} + +double d2dx::TimeToMs(int64_t time) +{ assert(_freq); - return (float)(double(li.QuadPart - sinceThisTime) / _freq); + return static_cast(time) / _freq; } #define STATUS_SUCCESS (0x00000000) diff --git a/src/d2dx/Utils.h b/src/d2dx/Utils.h index ac8d937..7ca8835 100644 --- a/src/d2dx/Utils.h +++ b/src/d2dx/Utils.h @@ -29,7 +29,8 @@ namespace d2dx } int64_t TimeStart(); - float TimeEndMs(int64_t start); + int64_t TimeEnd(int64_t start); + double TimeToMs(int64_t time); #ifdef NDEBUG