moonlight-common-c
moonlight-common-c copied to clipboard
Improve support for high-resolution stats
NOTE: Users of this library may need to make changes. I've also submitted a sister patch for moonlight-qt that supports these changes and implements a few new features like an audio overlay.
-
This patch adds a new microsecond-resolution function call, LiGetMicroseconds(), to complement the existing LiGetMillis(). Many variables used by stats have been updated to work at this higher resolution and now provide better results when displaying e.g. sub-millisecond frametime stats. To try and avoid confusion, variables that now contain microseconds have been renamed with a suffix of 'Us', and those ending in 'Ms' contain milliseconds. I originally experimented with nanoseconds but it felt like overkill for our needs.
-
Since this library is designed to be mostly standalone, I reorganized Platform.c a bit to make it compatible with SDL's GetTicks64(), which starts its ticker at program start. A lot of the stats here are used with those in moonlight-qt so I tried to simplify the functions as much as possible. Each platform now has its own few smaller functions, instead of trying to fit a complex set of ifdef's inside the same function.
-
I added a simple gtest suite for the Platform.c changes, and this test suite should be easy to extend to other areas of the code.
Internal API:
void Plt_TicksInit(void); // store initial timestamp
uint64_t Plt_GetTicks64_us(void); // The most precision, in microseconds
uint64_t Plt_GetTicks64_ms(void); // Plt_GetTicks64_ms returns the value in milliseconds
uint64_t Plt_GetTicks64(void); // Alias to _ms() and compatible with SDL_GetTicks64 (ms since program start)
uint64_t PltGetMillis(void); // replaced by Plt_GetTicks64_ms()
Public API in Limelight.h:
uint64_t LiGetMicroseconds(void);
uint64_t LiGetMillis(void);
PRTP_AUDIO_STATS LiGetRTPAudioStats(void); // provides access to RTP data for the overlay stats PRTP_VIDEO_STATS LiGetRTPVideoStats(void);