diff --git a/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll index 459321c..23801fd 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 67c6886..238aaf8 100644 Binary files a/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll and b/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll differ diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Common.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.cpp index 9e90e85..5a2b694 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Common.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.cpp @@ -62,3 +62,18 @@ void SendMessageToUnity(Message message) { g_messages.push(message); } + + +ScopedTimer::ScopedTimer(TimerFuncType&& func) + : func_(func) + , start_(std::chrono::high_resolution_clock::now()) +{ +} + + +ScopedTimer::~ScopedTimer() +{ + const auto end = std::chrono::high_resolution_clock::now(); + const auto time = std::chrono::duration_cast(end - start_); + func_(time); +} diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h index 7f04629..da1dc70 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h @@ -2,6 +2,7 @@ #include #include +#include #include @@ -32,7 +33,23 @@ public: ~ScopedReleaser() { func_(); } private: - ReleaseFuncType func_; + const ReleaseFuncType func_; +}; + + + +// Timer +class ScopedTimer +{ +public: + using microseconds = std::chrono::microseconds; + using TimerFuncType = std::function; + ScopedTimer(TimerFuncType&& func); + ~ScopedTimer(); + +private: + const TimerFuncType func_; + const std::chrono::time_point start_; }; diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp index f23e72b..f1b2c27 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp @@ -1,5 +1,7 @@ #pragma once +#include + #include "Duplicator.h" #include "Monitor.h" #include "MonitorManager.h" @@ -139,12 +141,25 @@ void Duplicator::Start() thread_ = std::thread([this] { + using namespace std::chrono; + state_ = State::Running; shouldRun_ = true; while (shouldRun_) { - if (!Duplicate()) break; + const UINT timeout = 16 /* milliseconds */; + + ScopedTimer timer([timeout] (microseconds us) + { + const auto waitTime = milliseconds(timeout) - us; + if (waitTime > microseconds::zero()) + { + std::this_thread::sleep_for(waitTime); + } + }); + + if (!Duplicate(timeout)) break; } if (state_ == State::Running) @@ -211,12 +226,10 @@ const Duplicator::Frame& Duplicator::GetLastFrame() const } -bool Duplicator::Duplicate() +bool Duplicator::Duplicate(UINT timeout) { if (!dupl_ || !device_) return false; - const UINT timeout = 16; - ComPtr resource; DXGI_OUTDUPL_FRAME_INFO frameInfo; const auto hr = dupl_->AcquireNextFrame(timeout, &frameInfo, &resource); diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.h index 0619ad1..86702d3 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.h @@ -67,7 +67,7 @@ private: void InitializeDuplication(); void CheckUnityAdapter(); - bool Duplicate(); + bool Duplicate(UINT timeout); void UpdateCursor( const Microsoft::WRL::ComPtr& texture,