diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index 7536cf1868..3144acd3c3 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -105,7 +105,7 @@ namespace df InitGLDependentResource(); while (!IsCancelled()) - ProcessSingleMessage(true); + ProcessSingleMessage(); ReleaseResources(); } diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 4af338ce97..f5409ba219 100644 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -289,7 +289,7 @@ namespace df context->makeCurrent(); my::Timer timer; - double processingTime = InitAvarageTimePerMessage; // By init we think that one message processed by 1ms + //double processingTime = InitAvarageTimePerMessage; // By init we think that one message processed by 1ms timer.Reset(); while (!IsCancelled()) @@ -297,23 +297,19 @@ namespace df context->setDefaultFramebuffer(); RenderScene(); - double avarageMessageTime = processingTime; - processingTime = timer.ElapsedSeconds(); - int messageCount = 0; + //double avarageMessageTime = processingTime; + //processingTime = timer.ElapsedSeconds(); + //int messageCount = 0; + double availableTime = VSyncInterval - (timer.ElapsedSeconds() /*+ avarageMessageTime*/); - while (timer.ElapsedSeconds() + avarageMessageTime < VSyncInterval) + while (availableTime > 0) { - ProcessSingleMessage(false); - messageCount++; + ProcessSingleMessage(availableTime * 1000.0); + availableTime = VSyncInterval - (timer.ElapsedSeconds() /*+ avarageMessageTime*/); + //messageCount++; } - if (messageCount == 0) - { - ProcessSingleMessage(false); - messageCount++; - } - - processingTime = (timer.ElapsedSeconds() - processingTime) / messageCount; + //processingTime = (timer.ElapsedSeconds() - processingTime) / messageCount; context->present(); timer.Reset(); diff --git a/drape_frontend/message_acceptor.cpp b/drape_frontend/message_acceptor.cpp index bfd6097f38..db7cb5de48 100644 --- a/drape_frontend/message_acceptor.cpp +++ b/drape_frontend/message_acceptor.cpp @@ -4,9 +4,9 @@ namespace df { - void MessageAcceptor::ProcessSingleMessage(bool waitMessage) + void MessageAcceptor::ProcessSingleMessage(unsigned maxTimeWait) { - TransferPointer transferMessage = m_messageQueue.PopMessage(waitMessage); + TransferPointer transferMessage = m_messageQueue.PopMessage(maxTimeWait); MasterPointer message(transferMessage); if (message.IsNull()) return; diff --git a/drape_frontend/message_acceptor.hpp b/drape_frontend/message_acceptor.hpp index 33ee9a393c..395b09ff2b 100644 --- a/drape_frontend/message_acceptor.hpp +++ b/drape_frontend/message_acceptor.hpp @@ -14,7 +14,7 @@ namespace df virtual void AcceptMessage(RefPointer message) = 0; /// Must be called by subclass on message target thread - void ProcessSingleMessage(bool waitMessage); + void ProcessSingleMessage(unsigned maxTimeWait = -1); void CloseQueue(); private: diff --git a/drape_frontend/message_queue.cpp b/drape_frontend/message_queue.cpp index 9e46aac426..1867a20a08 100644 --- a/drape_frontend/message_queue.cpp +++ b/drape_frontend/message_queue.cpp @@ -11,12 +11,11 @@ namespace df ClearQuery(); } - TransferPointer MessageQueue::PopMessage(bool waitMessage) + TransferPointer MessageQueue::PopMessage(unsigned maxTimeWait) { threads::ConditionGuard guard(m_condition); - if (waitMessage) - WaitMessage(); + WaitMessage(maxTimeWait); /// even waitNonEmpty == true m_messages can be empty after WaitMessage call /// if application preparing to close and CancelWait been called @@ -39,10 +38,10 @@ namespace df guard.Signal(); } - void MessageQueue::WaitMessage() + void MessageQueue::WaitMessage(unsigned maxTimeWait) { if (m_messages.empty()) - m_condition.Wait(); + m_condition.Wait(maxTimeWait); } void MessageQueue::CancelWait() diff --git a/drape_frontend/message_queue.hpp b/drape_frontend/message_queue.hpp index e4c44fb690..675b74ad22 100644 --- a/drape_frontend/message_queue.hpp +++ b/drape_frontend/message_queue.hpp @@ -16,13 +16,13 @@ namespace df ~MessageQueue(); /// if queue is empty than return NULL - TransferPointer PopMessage(bool waitMessage); + TransferPointer PopMessage(unsigned maxTimeWait); void PushMessage(TransferPointer message); void CancelWait(); void ClearQuery(); private: - void WaitMessage(); + void WaitMessage(unsigned maxTimeWait); private: threads::Condition m_condition;