From 15624dc0f4d60fb10e6f503af422855fb7c39ee2 Mon Sep 17 00:00:00 2001 From: hecomi Date: Fri, 6 Jan 2017 18:07:35 +0900 Subject: [PATCH] add frame rate setter and calc more accurate sleep duration. --- .../Plugins/x86/uDesktopDuplication.dll | Bin 86016 -> 86016 bytes .../Plugins/x86_64/uDesktopDuplication.dll | Bin 101888 -> 101888 bytes Assets/uDesktopDuplication/Scripts/Lib.cs | 2 ++ .../uDesktopDuplication/Duplicator.cpp | 9 ++++++--- .../uDesktopDuplication/MonitorManager.cpp | 12 ++++++++++++ .../uDesktopDuplication/MonitorManager.h | 4 +++- .../uDesktopDuplication/main.cpp | 6 ++++++ 7 files changed, 29 insertions(+), 4 deletions(-) diff --git a/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll index 23801fdefda984fab0334397de91783c55bb5597..abbd538739e4ec1fc9d3ef922b8b845e20c40643 100644 GIT binary patch delta 7533 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 KR`s3l(Ek8KNKwxK delta 7503 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 fx67a=tH^U?E2%P`Gb$;P%BjJK-t?GXPn`BcC diff --git a/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll index 238aaf8b597b43bf3177356faf929097f3e2c4b0..4dd1da20cb18ce6a3cf4fe9ec724aa069e47a83b 100644 GIT binary patch delta 19129 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 Q=AzBFHm7Lu1#I8{1FR&M3;+NC delta 18999 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 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