From fb6ccca542d98d868cb3fd1fae47d613bfdf01a0 Mon Sep 17 00:00:00 2001 From: MistEO Date: Tue, 18 Jan 2022 10:43:41 +0800 Subject: [PATCH] =?UTF-8?q?opt.=E4=BC=98=E5=8C=96=E6=88=AA=E5=9B=BE?= =?UTF-8?q?=E5=92=8C=E7=82=B9=E5=87=BB=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MeoAssistant/Assistant.cpp | 2 +- src/MeoAssistant/Controller.cpp | 30 +++++++++++++++++------------- src/MeoAssistant/Controller.h | 7 +++++-- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/MeoAssistant/Assistant.cpp b/src/MeoAssistant/Assistant.cpp index 209be07dec..ee27c57c8b 100644 --- a/src/MeoAssistant/Assistant.cpp +++ b/src/MeoAssistant/Assistant.cpp @@ -472,7 +472,7 @@ std::vector asst::Assistant::get_image() const bool asst::Assistant::ctrler_click(int x, int y, bool block) { - Ctrler.click_without_scale(Point(x, y), block); + Ctrler.click(Point(x, y), block); return true; } diff --git a/src/MeoAssistant/Controller.cpp b/src/MeoAssistant/Controller.cpp index 08db1351d6..92dd6ca6bd 100644 --- a/src/MeoAssistant/Controller.cpp +++ b/src/MeoAssistant/Controller.cpp @@ -695,6 +695,20 @@ bool asst::Controller::screencap(const std::string & cmd, DecodeFunc decode_func } return false; } +} + +cv::Mat asst::Controller::get_resized_image() const +{ + const static cv::Size dsize(m_scale_size.first, m_scale_size.second); + + std::shared_lock image_lock(m_image_mutex); + if (m_cache_image.empty()) { + Log.error("image is empty"); + return cv::Mat(dsize, CV_8UC3); + } + cv::Mat resized_mat; + cv::resize(m_cache_image, resized_mat, dsize); + return resized_mat; } int asst::Controller::click(const Point & p, bool block) @@ -818,25 +832,15 @@ cv::Mat asst::Controller::get_image(bool raw) return m_cache_image; } else { - const static cv::Size dsize(m_scale_size.first, m_scale_size.second); - if (m_cache_image.empty()) { - Log.error("image is empty"); - return cv::Mat(dsize, CV_8UC3); - } - cv::Mat resized_mat; - cv::resize(m_cache_image, resized_mat, dsize); - return resized_mat; + return get_resized_image(); } } std::vector asst::Controller::get_image_encode() { - std::shared_lock image_lock(m_image_mutex); - + cv::Mat img = get_resized_image(); std::vector buf; - cv::imencode(".png", m_cache_image, buf); - - image_lock.unlock(); + cv::imencode(".png", img, buf); return buf; } diff --git a/src/MeoAssistant/Controller.h b/src/MeoAssistant/Controller.h index 919a3fb92f..bd9e1db43c 100644 --- a/src/MeoAssistant/Controller.h +++ b/src/MeoAssistant/Controller.h @@ -69,9 +69,12 @@ namespace asst void pipe_working_proc(); std::optional> call_command(const std::string& cmd); int push_cmd(const std::string& cmd); - bool screencap(); + using DecodeFunc = std::function&)>; + bool screencap(); bool screencap(const std::string& cmd, DecodeFunc decode_func); + cv::Mat get_resized_image() const; + Point rand_point_in_rect(const Rect& rect); void random_delay() const; @@ -90,7 +93,7 @@ namespace asst std::atomic m_completed_id = 0; unsigned m_push_id = 0; // push_id的自增总是伴随着queue的push,肯定是要上锁的,所以没必要原子 - std::shared_mutex m_image_mutex; + mutable std::shared_mutex m_image_mutex; cv::Mat m_cache_image; constexpr static int PipeBuffSize = 4 * 1024 * 1024; // 管道缓冲区大小