perf: 优化截图耗时额外提示文本触发条件,改为由平均耗时触发 (#7868)

perf: 优化截图耗时额外提示文本触发条件,改为由平均耗时触发
This commit is contained in:
status102
2024-01-02 22:58:51 +08:00
committed by GitHub
8 changed files with 56 additions and 34 deletions

View File

@@ -466,7 +466,10 @@ bool asst::AdbController::screencap(cv::Mat& image_payload, bool allow_reconnect
}
if (m_screencap_time > 9) { // 每 10 次截图计算一次平均耗时
m_screencap_time = 0;
auto [screencap_cost_min, screencap_cost_max] = ranges::minmax(m_screencap_duration);
auto filted_duration = m_screencap_duration | views::filter([](long long num) { return num < INT_MAX; });
// 过滤后的有效截图用时次数
auto filted_count = m_screencap_duration.size() - ranges::count(m_screencap_duration, INT_MAX);
auto [screencap_cost_min, screencap_cost_max] = ranges::minmax(filted_duration);
json::value info = json::object {
{ "uuid", m_uuid },
{ "what", "ScreencapCost" },
@@ -474,8 +477,7 @@ bool asst::AdbController::screencap(cv::Mat& image_payload, bool allow_reconnect
json::object {
{ "min", screencap_cost_min },
{ "max", screencap_cost_max },
{ "avg", std::accumulate(m_screencap_duration.begin(), m_screencap_duration.end(), 0ll) /
m_screencap_duration.size() },
{ "avg", std::accumulate(filted_duration.begin(), filted_duration.end(), 0ll) / filted_count },
} },
};
callback(AsstMsg::ConnectionInfo, info);

View File

@@ -51,12 +51,15 @@ namespace MaaWpfGui.Helper
public static int StoneUsedTimes;
public static bool HasPrintedScreencapWarning;
public static void ClearCache()
{
SanityReport.HasSanityReport = false;
MedicineUsedTimes = 0;
ExpiringMedicineUsedTimes = 0;
StoneUsedTimes = 0;
HasPrintedScreencapWarning = false;
}
}

View File

@@ -457,33 +457,50 @@ namespace MaaWpfGui.Main
break;
case "FastestWayToScreencap":
string costString = details["details"]?["cost"]?.ToString() ?? "???";
string method = details["details"]?["method"]?.ToString() ?? "???";
{
string costString = details["details"]?["cost"]?.ToString() ?? "???";
string method = details["details"]?["method"]?.ToString() ?? "???";
StringBuilder fastestScreencapStringBuilder = new StringBuilder();
string color = UiLogColor.Trace;
if (!int.TryParse(costString, out var timeCost))
{
color = UiLogColor.Error;
}
else if (timeCost > 800)
{
color = UiLogColor.Error;
fastestScreencapStringBuilder.AppendLine().Append(LocalizationHelper.GetString("FastestWayToScreencapErrorTip"));
costString = timeCost.ToString("#,#");
}
else if (timeCost > 400)
{
color = UiLogColor.Warning;
fastestScreencapStringBuilder.AppendLine().Append(LocalizationHelper.GetString("FastestWayToScreencapWarningTip"));
StringBuilder fastestScreencapStringBuilder = new();
string color = UiLogColor.Trace;
if (!int.TryParse(costString, out var timeCost))
{
color = UiLogColor.Error;
}
else if (timeCost > 800)
{
color = UiLogColor.Error;
costString = timeCost.ToString("#,#");
}
else if (timeCost > 400)
{
color = UiLogColor.Warning;
}
fastestScreencapStringBuilder.Insert(0, string.Format(LocalizationHelper.GetString("FastestWayToScreencap"), costString));
Instances.TaskQueueViewModel.AddLog(fastestScreencapStringBuilder.ToString(), color);
Instances.CopilotViewModel.AddLog(fastestScreencapStringBuilder.ToString(), color);
}
fastestScreencapStringBuilder.Insert(0, string.Format(LocalizationHelper.GetString("FastestWayToScreencap"), costString));
Instances.TaskQueueViewModel.AddLog(fastestScreencapStringBuilder.ToString(), color);
Instances.CopilotViewModel.AddLog(fastestScreencapStringBuilder.ToString());
break;
case "ScreencapCost":
Instances.SettingsViewModel.ScreencapCost = string.Format(LocalizationHelper.GetString("ScreencapCost"), details["details"]?["min"]?.ToString() ?? "???", details["details"]?["avg"]?.ToString() ?? "???", details["details"]?["max"]?.ToString() ?? "???", DateTimeOffset.Now.ToString("HH:mm:ss"));
if (HasPrintedScreencapWarning || !int.TryParse(details["details"]?["avg"]?.ToString() ?? "???", out var screencapCostAvg))
{
}
else if (screencapCostAvg >= 800)
{
Instances.TaskQueueViewModel.AddLog(string.Format(LocalizationHelper.GetString("FastestWayToScreencapErrorTip"), screencapCostAvg), UiLogColor.Error);
Instances.CopilotViewModel.AddLog(string.Format(LocalizationHelper.GetString("FastestWayToScreencapErrorTip"), screencapCostAvg), UiLogColor.Error);
HasPrintedScreencapWarning = true;
}
else if (screencapCostAvg >= 400)
{
Instances.TaskQueueViewModel.AddLog(string.Format(LocalizationHelper.GetString("FastestWayToScreencapWarningTip"), screencapCostAvg), UiLogColor.Warning);
Instances.CopilotViewModel.AddLog(string.Format(LocalizationHelper.GetString("FastestWayToScreencapWarningTip"), screencapCostAvg), UiLogColor.Warning);
HasPrintedScreencapWarning = true;
}
break;
}
}

View File

@@ -559,8 +559,8 @@ The video aspect ratio needs to be 16:9 without interference factors such as bla
<system:String x:Key="TouchModeNotAvailable">Touch mode is not available, please go to 「Settings - Connection Settings」 to switch to a different touch mode.</system:String>
<system:String x:Key="ScreencapFailed">Screencap failed. If it happens repeatedly, try to restart or change the emulator!</system:String>
<system:String x:Key="FastestWayToScreencap">Screenshot test tasks: {0}ms</system:String>
<system:String x:Key="FastestWayToScreencapWarningTip">Screencap takes a long time which may cause some abnormal behaviors using automatic combat functions (e.g. Auto I. S.).</system:String>
<system:String x:Key="FastestWayToScreencapErrorTip">Screencap takes too long, so automatic combat functions (e.g. Auto I. S.) may not run properly. It is recommended to try restarting or changing the simulator!</system:String>
<system:String x:Key="FastestWayToScreencapWarningTip">Screencap takes a long time (avg: {0}ms) which may cause some abnormal behaviors using automatic combat functions (e.g. Auto I. S.).</system:String>
<system:String x:Key="FastestWayToScreencapErrorTip">Screencap takes too long (avg: {0}ms), so automatic combat functions (e.g. Auto I. S.) may not run properly. It is recommended to try restarting or changing the simulator!</system:String>
<system:String x:Key="IdentifyTheMistakes">Recognition error</system:String>
<system:String x:Key="TaskError" xml:space="preserve">Task error: </system:String>
<system:String x:Key="CombatError">Combat error</system:String>

View File

@@ -559,8 +559,8 @@ Bilibili: ログイン インターフェイスに表示されるアカウント
<system:String x:Key="TouchModeNotAvailable">タッチモードは利用できません。設定-接続設定に入って、他のタッチモードに変更してください。</system:String>
<system:String x:Key="ScreencapFailed">スクリーンキャプチャに失敗しました。繰り返し発生する場合は、エミュレータの再起動または変更をお試しください!</system:String>
<system:String x:Key="FastestWayToScreencap">スクリーンショット テストには: {0}ms</system:String>
<system:String x:Key="FastestWayToScreencapWarningTip">スクリーンキャップには時間がかかるため、自動戦闘機能 (Auto I.S. など) を使用すると異常な動作が発生する可能性があります。</system:String>
<system:String x:Key="FastestWayToScreencapErrorTip">スクリーンキャップに時間がかかりすぎるため、自動戦闘機能 (Auto I.S. など) が適切に動作しない可能性があります。 シミュレーターを再起動または変更してみることをお勧めします。</system:String>
<system:String x:Key="FastestWayToScreencapWarningTip">スクリーンキャップには時間がかかるため(平均: {0}ms)、自動戦闘機能 (Auto I.S. など) を使用すると異常な動作が発生する可能性があります。</system:String>
<system:String x:Key="FastestWayToScreencapErrorTip">スクリーンキャップに時間がかかりすぎるため(平均: {0}ms)、自動戦闘機能 (Auto I.S. など) が適切に動作しない可能性があります。 シミュレーターを再起動または変更してみることをお勧めします。</system:String>
<system:String x:Key="IdentifyTheMistakes">認識エラー</system:String>
<system:String x:Key="TaskError" xml:space="preserve">タスクエラー: </system:String>
<system:String x:Key="CombatError">戦闘エラー</system:String>

View File

@@ -559,8 +559,8 @@ Bilibili: 로그인 인터페이스에 표시되는 계정 이름(예: 장산)
<system:String x:Key="TouchModeNotAvailable">터치 수행 방식이 사용 불가능합니다. 설정 - 연결 설정에서 다른 방식으로 변경해 주세요.</system:String>
<system:String x:Key="ScreencapFailed">스크린샷 캡처에 실패했습니다. 반복적으로 발생 시 에뮬레이터를 다시 시작하거나 변경해 보세요!</system:String>
<system:String x:Key="FastestWayToScreencap">스크린샷 캡쳐 속도: {0}ms</system:String>
<system:String x:Key="FastestWayToScreencapWarningTip">스크린샷을 찍는 데 시간이 오래 걸리므로 자동 전투 기능(예: Auto I. S.)을 사용하면 비정상적인 동작이 발생할 수 있습니다.</system:String>
<system:String x:Key="FastestWayToScreencapErrorTip">스크린샷을 찍는 데 시간이 오래 걸리므로 자동 전투 기능(예: Auto I.S.)이 제대로 실행되지 않을 수 있습니다. 시뮬레이터를 다시 시작하거나 변경해 보는 것이 좋습니다!</system:String>
<system:String x:Key="FastestWayToScreencapWarningTip">스크린샷을 찍는 데 시간이 오래 걸리므로(평균: {0}ms) 자동 전투 기능(예: Auto I. S.)을 사용하면 비정상적인 동작이 발생할 수 있습니다.</system:String>
<system:String x:Key="FastestWayToScreencapErrorTip">화면 캡처 시간이 너무 길어(평균: {0}ms) 자동 전투 기능(예: Auto I.S.)이 제대로 실행되지 않을 수 있습니다. 시뮬레이터를 다시 시작하거나 변경해 보는 것이 좋습니다!</system:String>
<system:String x:Key="IdentifyTheMistakes">인식 오류</system:String>
<system:String x:Key="TaskError" xml:space="preserve">작업 오류: </system:String>
<system:String x:Key="CombatError">작전 오류</system:String>

View File

@@ -559,8 +559,8 @@
<system:String x:Key="TouchModeNotAvailable">触控模式不可用。请进入 设置 - 连接设置 切换其他触控模式。</system:String>
<system:String x:Key="ScreencapFailed">截图失败,如反复出现请尝试重启或更换模拟器!</system:String>
<system:String x:Key="FastestWayToScreencap">最快截图耗时: {0}ms</system:String>
<system:String x:Key="FastestWayToScreencapWarningTip">截图用时较长,使用自动战斗类功能(如自动肉鸽)时,可能出现部分异常表现</system:String>
<system:String x:Key="FastestWayToScreencapErrorTip">截图用时过长,自动战斗类功能(如自动肉鸽)很可能无法正常运行,建议尝试重启或更换模拟器</system:String>
<system:String x:Key="FastestWayToScreencapWarningTip">截图用时较长(平均: {0}ms),使用自动战斗类功能(如自动肉鸽)时,可能出现部分异常表现</system:String>
<system:String x:Key="FastestWayToScreencapErrorTip">截图用时过长(平均: {0}ms),自动战斗类功能(如自动肉鸽)很可能无法正常运行,建议尝试重启或更换模拟器</system:String>
<system:String x:Key="IdentifyTheMistakes">识别错误</system:String>
<system:String x:Key="TaskError" xml:space="preserve">任务出错: </system:String>
<system:String x:Key="CombatError">战斗出错</system:String>

View File

@@ -557,8 +557,8 @@
<system:String x:Key="TouchModeNotAvailable">觸控模式不可用。請進入 設定 - 連接設定 切換其他觸控模式。</system:String>
<system:String x:Key="ScreencapFailed">截圖失敗,如反覆出現請嘗試重開或更換模擬器!</system:String>
<system:String x:Key="FastestWayToScreencap">最快截圖用時: {0}ms</system:String>
<system:String x:Key="FastestWayToScreencapWarningTip">截圖用時較長,使用自動戰鬥類功能(如自動肉鴿)時,可能會出現部分異常表現</system:String>
<system:String x:Key="FastestWayToScreencapErrorTip">截圖用時過長,自動戰鬥類功能(如自動肉鴿)很可能無法正常運行,建議嘗試重新啟動或更換模擬器</system:String>
<system:String x:Key="FastestWayToScreencapWarningTip">截圖用時較長(平均: {0}ms),使用自動戰鬥類功能(如自動肉鴿)時,可能會出現部分異常表現</system:String>
<system:String x:Key="FastestWayToScreencapErrorTip">截圖用時過長(平均: {0}ms),自動戰鬥類功能(如自動肉鴿)很可能無法正常運行,建議嘗試重新啟動或更換模擬器</system:String>
<system:String x:Key="IdentifyTheMistakes">辨識錯誤</system:String>
<system:String x:Key="TaskError" xml:space="preserve">任務出錯: </system:String>
<system:String x:Key="CombatError">戰鬥出錯</system:String>