From f5583a14c0180e569cf31cd98caeb3d1e0b8bc0d Mon Sep 17 00:00:00 2001 From: status102 Date: Tue, 31 Oct 2023 13:34:18 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E7=90=86=E6=99=BA=E8=AF=86=E5=88=AB?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E4=BC=98=E5=8C=96=EF=BC=9A=E5=AF=B9=E8=AF=86?= =?UTF-8?q?=E5=88=AB=E5=8C=BA=E5=9F=9F=E9=A2=84=E5=A4=84=E7=90=86=EF=BC=9B?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A4=B1=E8=B4=A5=E5=90=8E=E9=87=8D=E8=AF=95?= =?UTF-8?q?=EF=BC=9B=E4=BC=98=E5=8C=96log=E8=BE=93=E5=87=BA=20(#7084)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resource/tasks.json | 3 +- .../Task/Fight/SanityBeforeStagePlugin.cpp | 47 +++++++++++-------- .../Task/Fight/SanityBeforeStagePlugin.h | 7 +-- 3 files changed, 33 insertions(+), 24 deletions(-) diff --git a/resource/tasks.json b/resource/tasks.json index 5ba3223e6c..3cf39cd36d 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -4164,8 +4164,7 @@ 20, 160, 40 - ], - "preDelay": 300 + ] }, "UseMedicine": { "doc": "绑定MedicineCounter来使用理智药", diff --git a/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.cpp b/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.cpp index 4d9652ee98..597704d403 100644 --- a/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.cpp +++ b/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.cpp @@ -1,10 +1,11 @@ #include "SanityBeforeStagePlugin.h" -#include +#include #include "Config/TaskData.h" #include "Controller/Controller.h" #include "Utils/Logger.hpp" +#include "Utils/NoWarningCV.h" #include "Utils/StringMisc.hpp" #include "Vision/RegionOCRer.h" @@ -30,46 +31,55 @@ bool asst::SanityBeforeStagePlugin::verify(AsstMsg msg, const json::value& detai bool asst::SanityBeforeStagePlugin::_run() { - LogTraceFunction; - - get_sanity_before_stage(); + int retry = 0; + while (!need_exit() && retry < 3) { + if (get_sanity_before_stage() || retry >= 3) { + break; + } + ++retry; + Log.warn(__FUNCTION__, "Sanity ocr failed, retry:", retry); + sleep(Config.get_options().task_delay); + } return true; } -/// -/// 获取 当前理智/最大理智 -/// -void asst::SanityBeforeStagePlugin::get_sanity_before_stage() +bool asst::SanityBeforeStagePlugin::get_sanity_before_stage() { LogTraceFunction; - sleep(Task.get("SanityMatch")->pre_delay); + const static auto task = Task.get("SanityMatch"); + auto img = make_roi(ctrler()->get_image(), task->roi); + cv::normalize(img, img, 255.0, 0.0, cv::NormTypes::NORM_MINMAX); - RegionOCRer analyzer(ctrler()->get_image()); - analyzer.set_task_info("SanityMatch"); + RegionOCRer analyzer(img); + analyzer.set_replace(task->replace_map); auto res_opt = analyzer.analyze(); json::value sanity_info = basic_info_with_what("SanityBeforeStage"); do { - if (!res_opt) { + if (!res_opt) [[unlikely]] { + Log.warn(__FUNCTION__, "Sanity ocr failed"); break; } std::string_view text = res_opt->text; auto slash_pos = text.find('/'); - if (slash_pos == std::string_view::npos) { + if (slash_pos == std::string_view::npos) [[unlikely]] { + Log.warn(__FUNCTION__, "Sanity ocr result without '/':", text); break; } int sanity_cur = 0, sanity_max = 0; if (!utils::chars_to_number(text.substr(0, slash_pos), sanity_cur) || - !utils::chars_to_number(text.substr(slash_pos + 1), sanity_max)) { + !utils::chars_to_number(text.substr(slash_pos + 1), sanity_max)) [[unlikely]] { + Log.warn(__FUNCTION__, "Sanity ocr result could not convert to int:", text); break; } Log.info(__FUNCTION__, "Current Sanity:", sanity_cur, ", Max Sanity:", sanity_max); - if (sanity_cur < 0 || sanity_max > 135 || sanity_max < 82 /* 一级博士上限为82 */) { + if (sanity_cur < 0 || sanity_max > 135 || sanity_max < 82 /* 一级博士上限为82 */) [[unlikely]] { + Log.warn(__FUNCTION__, "Sanity out of limit"); break; } @@ -78,13 +88,12 @@ void asst::SanityBeforeStagePlugin::get_sanity_before_stage() sanity_info["details"]["max_sanity"] = sanity_max; sanity_info["details"]["report_time"] = utils::get_format_time(); callback(AsstMsg::SubTaskExtraInfo, sanity_info); - return; + return true; } while (false); - Log.warn(__FUNCTION__, "Sanity analyze failed"); - save_img(utils::path("debug") / utils::path("sanity")); - + analyzer.save_img(utils::path("debug") / utils::path("sanity")); // 识别失败返回空json。缓存数据需要作废 callback(AsstMsg::SubTaskExtraInfo, sanity_info); + return false; } diff --git a/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.h b/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.h index a6c8a24260..2603f6c98d 100644 --- a/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.h +++ b/src/MaaCore/Task/Fight/SanityBeforeStagePlugin.h @@ -1,7 +1,5 @@ #pragma once #include "Task/AbstractTaskPlugin.h" - -#include namespace asst { class SanityBeforeStagePlugin final : public AbstractTaskPlugin @@ -14,6 +12,9 @@ namespace asst private: virtual bool _run() override; - void get_sanity_before_stage(); + + // 获取 当前理智/最大理智 + // 返回 是否获取成功 + bool get_sanity_before_stage(); }; }