perf: 优化在定义基建获取房间信息的效率

perf https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/1914
This commit is contained in:
MistEO
2022-09-23 01:40:52 +08:00
parent 813e60b19f
commit dfb5f327af

View File

@@ -71,6 +71,7 @@ asst::infrast::CustomRoomConfig& asst::InfrastAbstractTask::current_room_config(
{
static infrast::CustomRoomConfig empty;
if (!m_is_custom) {
Log.error(__FUNCTION__, "custom is not enabled");
return empty;
}
@@ -78,7 +79,7 @@ asst::infrast::CustomRoomConfig& asst::InfrastAbstractTask::current_room_config(
return m_custom_config[m_cur_facility_index];
}
else {
Log.error("tab size is lager than config size", m_cur_facility_index, m_custom_config.size());
Log.error(__FUNCTION__, "tab size is lager than config size", m_cur_facility_index, m_custom_config.size());
return empty;
}
}
@@ -160,11 +161,12 @@ bool asst::InfrastAbstractTask::swipe_and_select_custom_opers(bool is_dorm_order
{
LogTraceFunction;
auto& room_config = current_room_config();
{
json::value cb_info = basic_info_with_what("CustomInfrastRoomOperators");
auto& details = cb_info["details"];
details["names"] = json::array(current_room_config().names);
details["candidates"] = json::array(current_room_config().candidates);
details["names"] = json::array(room_config.names);
details["candidates"] = json::array(room_config.candidates);
callback(AsstMsg::SubTaskExtraInfo, cb_info);
}
@@ -172,9 +174,8 @@ bool asst::InfrastAbstractTask::swipe_and_select_custom_opers(bool is_dorm_order
ProcessTask(*this, { "InfrastOperListTabSkillUnClicked", "Stop" }).run();
}
std::vector<std::string> opers_order = current_room_config().names;
opers_order.insert(opers_order.end(), current_room_config().candidates.cbegin(),
current_room_config().candidates.cend());
std::vector<std::string> opers_order = room_config.names;
opers_order.insert(opers_order.end(), room_config.candidates.cbegin(), room_config.candidates.cend());
std::vector<std::string> pre_partial_result;
bool retried = false;
@@ -188,8 +189,8 @@ bool asst::InfrastAbstractTask::swipe_and_select_custom_opers(bool is_dorm_order
if (!select_custom_opers(partial_result)) {
return false;
}
if (current_room_config().selected >= max_num_of_opers() ||
(current_room_config().names.empty() && current_room_config().candidates.empty())) {
if (room_config.selected >= max_num_of_opers() ||
(room_config.names.empty() && room_config.candidates.empty())) {
break;
}
if (partial_result == pre_partial_result) {
@@ -225,24 +226,25 @@ bool asst::InfrastAbstractTask::swipe_and_select_custom_opers(bool is_dorm_order
ProcessTask(*this, { "InfrastOperListTabWorkStatusUnClicked" }).run();
}
if (current_room_config().sort || current_room_config().autofill) {
if (room_config.sort || room_config.autofill) {
swipe_to_the_left_of_operlist(swipe_times / 5 + 1);
swipe_times = 0;
}
// 如果只选了一个人没必要排序
if (current_room_config().sort && current_room_config().selected > 1) {
if (room_config.sort && room_config.selected > 1) {
click_clear_button();
order_opers_selection(opers_order);
}
return current_room_config().names.empty();
return room_config.names.empty();
}
bool asst::InfrastAbstractTask::select_custom_opers(std::vector<std::string>& partial_result)
{
LogTraceFunction;
if (current_room_config().names.empty() && current_room_config().candidates.empty()) {
auto& room_config = current_room_config();
if (room_config.names.empty() && room_config.candidates.empty()) {
Log.warn("opers_name is empty");
return false;
}
@@ -269,14 +271,14 @@ bool asst::InfrastAbstractTask::select_custom_opers(std::vector<std::string>& pa
const std::string& name = name_analyzer.get_result().front().text;
partial_result.emplace_back(name);
if (auto iter = ranges::find(current_room_config().names, name); iter != current_room_config().names.end()) {
current_room_config().names.erase(iter);
if (auto iter = ranges::find(room_config.names, name); iter != room_config.names.end()) {
room_config.names.erase(iter);
}
else if (max_num_of_opers() - current_room_config().selected >
current_room_config().names.size()) { // names中的数量比剩余的空位多就可以选备选的
if (auto candd_iter = ranges::find(current_room_config().candidates, name);
candd_iter != current_room_config().candidates.end()) {
current_room_config().candidates.erase(candd_iter);
else if (max_num_of_opers() - room_config.selected >
room_config.names.size()) { // names中的数量比剩余的空位多就可以选备选的
if (auto candd_iter = ranges::find(room_config.candidates, name);
candd_iter != room_config.candidates.end()) {
room_config.candidates.erase(candd_iter);
}
else {
continue;
@@ -288,7 +290,7 @@ bool asst::InfrastAbstractTask::select_custom_opers(std::vector<std::string>& pa
if (!oper.selected) {
m_ctrler->click(oper.rect);
}
if (++current_room_config().selected >= max_num_of_opers()) {
if (++room_config.selected >= max_num_of_opers()) {
break;
}
}