mirror of
https://github.com/moonlight-stream/moonlight-chrome.git
synced 2025-08-17 16:46:31 +00:00
Batch mouse movement events to reduce input lag with high polling rate mice
This commit is contained in:
parent
59e3a104ba
commit
37387e151f
12
input.cpp
12
input.cpp
@ -51,6 +51,13 @@ static char GetModifierFlags(const pp::InputEvent& event) {
|
|||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MoonlightInstance::ReportMouseMovement() {
|
||||||
|
if (m_MouseDeltaX != 0 || m_MouseDeltaY != 0) {
|
||||||
|
LiSendMouseMoveEvent(m_MouseDeltaX, m_MouseDeltaY);
|
||||||
|
m_MouseDeltaX = m_MouseDeltaY = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool MoonlightInstance::HandleInputEvent(const pp::InputEvent& event) {
|
bool MoonlightInstance::HandleInputEvent(const pp::InputEvent& event) {
|
||||||
switch (event.GetType()) {
|
switch (event.GetType()) {
|
||||||
case PP_INPUTEVENT_TYPE_MOUSEDOWN: {
|
case PP_INPUTEVENT_TYPE_MOUSEDOWN: {
|
||||||
@ -77,7 +84,10 @@ bool MoonlightInstance::HandleInputEvent(const pp::InputEvent& event) {
|
|||||||
pp::MouseInputEvent mouseEvent(event);
|
pp::MouseInputEvent mouseEvent(event);
|
||||||
pp::Point posDelta = mouseEvent.GetMovement();
|
pp::Point posDelta = mouseEvent.GetMovement();
|
||||||
|
|
||||||
LiSendMouseMoveEvent(posDelta.x(), posDelta.y());
|
// Wait to report mouse movement until the next input polling window
|
||||||
|
// to allow batching to occur which reduces overall input lag.
|
||||||
|
m_MouseDeltaX += posDelta.x();
|
||||||
|
m_MouseDeltaY += posDelta.y();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
7
main.cpp
7
main.cpp
@ -85,18 +85,19 @@ void* MoonlightInstance::StopThreadFunc(void* context) {
|
|||||||
|
|
||||||
// We also need to stop this thread after the connection thread, because it depends
|
// We also need to stop this thread after the connection thread, because it depends
|
||||||
// on being initialized there.
|
// on being initialized there.
|
||||||
pthread_join(g_Instance->m_GamepadThread, NULL);
|
pthread_join(g_Instance->m_InputThread, NULL);
|
||||||
|
|
||||||
// Stop the connection
|
// Stop the connection
|
||||||
LiStopConnection();
|
LiStopConnection();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* MoonlightInstance::GamepadThreadFunc(void* context) {
|
void* MoonlightInstance::InputThreadFunc(void* context) {
|
||||||
MoonlightInstance* me = (MoonlightInstance*)context;
|
MoonlightInstance* me = (MoonlightInstance*)context;
|
||||||
|
|
||||||
while (me->m_Running) {
|
while (me->m_Running) {
|
||||||
me->PollGamepads();
|
me->PollGamepads();
|
||||||
|
me->ReportMouseMovement();
|
||||||
|
|
||||||
// Poll every 10 ms
|
// Poll every 10 ms
|
||||||
usleep(10 * 1000);
|
usleep(10 * 1000);
|
||||||
@ -135,7 +136,7 @@ void* MoonlightInstance::ConnectionThreadFunc(void* context) {
|
|||||||
// Set running state before starting connection-specific threads
|
// Set running state before starting connection-specific threads
|
||||||
me->m_Running = true;
|
me->m_Running = true;
|
||||||
|
|
||||||
pthread_create(&me->m_GamepadThread, NULL, MoonlightInstance::GamepadThreadFunc, me);
|
pthread_create(&me->m_InputThread, NULL, MoonlightInstance::InputThreadFunc, me);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -59,6 +59,8 @@ class MoonlightInstance : public pp::Instance, public pp::MouseLock {
|
|||||||
m_MouseLocked(false),
|
m_MouseLocked(false),
|
||||||
m_WaitingForAllModifiersUp(false),
|
m_WaitingForAllModifiersUp(false),
|
||||||
m_AccumulatedTicks(0),
|
m_AccumulatedTicks(0),
|
||||||
|
m_MouseDeltaX(0),
|
||||||
|
m_MouseDeltaY(0),
|
||||||
openHttpThread(this) {
|
openHttpThread(this) {
|
||||||
// This function MUST be used otherwise sockets don't work (nacl_io_init() doesn't work!)
|
// This function MUST be used otherwise sockets don't work (nacl_io_init() doesn't work!)
|
||||||
nacl_io_init_ppapi(pp_instance(), pp::Module::Get()->get_browser_interface());
|
nacl_io_init_ppapi(pp_instance(), pp::Module::Get()->get_browser_interface());
|
||||||
@ -85,6 +87,7 @@ class MoonlightInstance : public pp::Instance, public pp::MouseLock {
|
|||||||
void PairCallback(int32_t /*result*/, int32_t callbackId, pp::VarArray args);
|
void PairCallback(int32_t /*result*/, int32_t callbackId, pp::VarArray args);
|
||||||
|
|
||||||
bool HandleInputEvent(const pp::InputEvent& event);
|
bool HandleInputEvent(const pp::InputEvent& event);
|
||||||
|
void ReportMouseMovement();
|
||||||
|
|
||||||
void PollGamepads();
|
void PollGamepads();
|
||||||
|
|
||||||
@ -105,7 +108,7 @@ class MoonlightInstance : public pp::Instance, public pp::MouseLock {
|
|||||||
static void ProfilerPrintWarning(const char* message);
|
static void ProfilerPrintWarning(const char* message);
|
||||||
|
|
||||||
static void* ConnectionThreadFunc(void* context);
|
static void* ConnectionThreadFunc(void* context);
|
||||||
static void* GamepadThreadFunc(void* context);
|
static void* InputThreadFunc(void* context);
|
||||||
static void* StopThreadFunc(void* context);
|
static void* StopThreadFunc(void* context);
|
||||||
|
|
||||||
static void ClStageStarting(int stage);
|
static void ClStageStarting(int stage);
|
||||||
@ -151,7 +154,7 @@ class MoonlightInstance : public pp::Instance, public pp::MouseLock {
|
|||||||
bool m_Running;
|
bool m_Running;
|
||||||
|
|
||||||
pthread_t m_ConnectionThread;
|
pthread_t m_ConnectionThread;
|
||||||
pthread_t m_GamepadThread;
|
pthread_t m_InputThread;
|
||||||
|
|
||||||
pp::Graphics3D m_Graphics3D;
|
pp::Graphics3D m_Graphics3D;
|
||||||
pp::VideoDecoder* m_VideoDecoder;
|
pp::VideoDecoder* m_VideoDecoder;
|
||||||
@ -173,6 +176,7 @@ class MoonlightInstance : public pp::Instance, public pp::MouseLock {
|
|||||||
bool m_MouseLocked;
|
bool m_MouseLocked;
|
||||||
bool m_WaitingForAllModifiersUp;
|
bool m_WaitingForAllModifiersUp;
|
||||||
float m_AccumulatedTicks;
|
float m_AccumulatedTicks;
|
||||||
|
int32_t m_MouseDeltaX, m_MouseDeltaY;
|
||||||
|
|
||||||
pp::SimpleThread openHttpThread;
|
pp::SimpleThread openHttpThread;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user