diff --git a/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll index 23801fd..abbd538 100644 Binary files a/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll and b/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll differ diff --git a/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll index 238aaf8..4dd1da2 100644 Binary files a/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll and b/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll differ diff --git a/Assets/uDesktopDuplication/Scripts/Lib.cs b/Assets/uDesktopDuplication/Scripts/Lib.cs index 53d7d71..88cb866 100644 --- a/Assets/uDesktopDuplication/Scripts/Lib.cs +++ b/Assets/uDesktopDuplication/Scripts/Lib.cs @@ -172,6 +172,8 @@ public static class Lib public static extern bool HasBeenUpdated(int id); [DllImport("uDesktopDuplication")] public static extern bool UseGetPixels(int id, bool use); + [DllImport("uDesktopDuplication")] + public static extern void SetFrameRate(uint frameRate); public static string GetName(int id) { diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp index f1b2c27..f4d8ac6 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp @@ -148,17 +148,20 @@ void Duplicator::Start() shouldRun_ = true; while (shouldRun_) { - const UINT timeout = 16 /* milliseconds */; + const auto frameRate = GetMonitorManager()->GetFrameRate(); + const UINT frameMicroSeconds = 1000000 / frameRate; + const UINT frameMilliSeconds = 1000 / frameRate; - ScopedTimer timer([timeout] (microseconds us) + ScopedTimer timer([frameMicroSeconds] (microseconds us) { - const auto waitTime = milliseconds(timeout) - us; + const auto waitTime = microseconds(frameMicroSeconds) - us; if (waitTime > microseconds::zero()) { std::this_thread::sleep_for(waitTime); } }); + const auto timeout = static_cast(frameMilliSeconds); if (!Duplicate(timeout)) break; } diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.cpp index 218f163..26fd47c 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.cpp @@ -168,3 +168,15 @@ int MonitorManager::GetTotalHeight() const const auto maxBottom = *std::max_element(bottoms.begin(), bottoms.end()); return maxBottom - minTop; } + + +void MonitorManager::SetFrameRate(UINT frameRate) +{ + frameRate_ = frameRate; +} + + +UINT MonitorManager::GetFrameRate() const +{ + return frameRate_; +} diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.h b/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.h index 8271391..49212a7 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.h @@ -25,6 +25,8 @@ public: int GetCursorMonitorId() const { return cursorMonitorId_; } std::shared_ptr GetMonitor(int id) const; std::shared_ptr GetCursor() const; + void SetFrameRate(UINT frameRate); + UINT GetFrameRate() const; public: int GetMonitorCount() const; @@ -33,7 +35,7 @@ public: private: LUID unityAdapterLuid_; - + UINT frameRate_ = 60; bool enableTextureCopyFromGpuToCpu_ = false; std::vector> monitors_; std::shared_ptr cursor_ = std::make_shared(); diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp index 01b94db..73da3c7 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp @@ -439,4 +439,10 @@ extern "C" return monitor->UseGetPixels(use); } } + + UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API SetFrameRate(UINT frameRate) + { + if (!g_manager) return; + g_manager->SetFrameRate(frameRate); + } } \ No newline at end of file