ArkMowers / arknights-mower

《明日方舟》长草助手
https://arkmowers.github.io/arknights-mower/
MIT License
507 stars 53 forks source link

某些情况下陷入死循环通过重启解决(实施自动化异常处理和重置恢复策略提案) #576

Closed lethefrost closed 4 months ago

lethefrost commented 4 months ago

mower 当前的异常处理机制不是非常健壮,运行时间长了很容易走进各种 deadend。目前有蛮多情况会导致 mower 陷入死循环的,比方说永远卡在没能正确识别、或者没有预设处理逻辑的界面,或者计时线程出错整个 mower 直接永久休眠不再被定时任务唤醒运行。这种时候往往需要手动重启来恢复运作。

有时候挂着很长时间忘了看,偶然再打开 mower 和模拟器的时候会发现已经卡在某个界面好几个小时甚至几天了,体力早满了全员也注意力涣散了,这时候手动重启下也就算了,但有时候出个远门好长一段时间没法手动恢复,家里电脑上 mower 就一直卡在那里什么的就更麻烦了。因此我觉得如果能有个自动化的恢复机制会较有帮助。

存在大量各不相同的、会导致此类死循环的情景(见 #489 #488 #565 #574 等等,我自己还遇到过许多另外的比如意外进入并卡死在商店页、抽卡页、干员详情、编队页等),为每个错误场景人工一一添加处理逻辑可能还需要较长开发和等待周期,这里计划先做一个较为泛用的简易解决方案作为一个临时的 stopgap

  1. 重启明日方舟可以解决因为卡在无法识别/处理的页面所引起的死循环
  2. 重启 mower 任务线程可以解决由于任务安排导致的卡死

我目前关于实现这项功能的想法大概是这样:

设置项

  1. 是否启用暴力自修复程序 bool 默认否(无这个需求的用户默认保持和当前一致的体验)
  2. 检测间隔 int 单位分钟
  3. 异常容差 int 单位分钟
  4. 单轮工作时长上限 int 单位分钟

触发条件和重启逻辑

你们看这个可行吗?抛砖引玉了,大家有什么更好的意见请一起分享讨论!

我这阵子还有点其他事要忙,忙完之后开工搞这个,大家看看这个提的合不合理有没有其他人有需求的,做完之后要不要 merge 过来主仓库(以及有没有人有空顺便把这个做了啊,我想偷个懒(。)

ZhaoZuohong commented 4 months ago

如果识别有问题,重启之后还是会在相同的位置以相同的方式卡住

lethefrost commented 4 months ago

如果识别有问题,重启之后还是会在相同的位置以相同的方式卡住

并不会的,试过很多次手动重启可以解决问题。而且除了重启 mower 还有重启方舟,两种重启一起使用基本上能恢复大部分卡住的情况

ZhaoZuohong commented 4 months ago

并不会的,试过很多次手动重启可以解决问题。

你好,我说的是“如果识别有问题”。

ZhaoZuohong commented 4 months ago

某些情况下陷入死循环通过重启解决

你标题也写了是“某些情况”吧

ZhaoZuohong commented 4 months ago

https://github.com/ArkMowers/arknights-mower/blob/2d69a52a30005cf96bc4761fcecd150ce2f914a4/arknights_mower/utils/solver.py#L496

https://github.com/ArkMowers/arknights-mower/blob/2d69a52a30005cf96bc4761fcecd150ce2f914a4/arknights_mower/solvers/sign_in.py#L127

https://github.com/ArkMowers/arknights-mower/blob/2d69a52a30005cf96bc4761fcecd150ce2f914a4/arknights_mower/utils/recognize.py#L81

而且你说的已经部分实装了。。。

lethefrost commented 4 months ago

某些情况下陷入死循环通过重启解决

你标题也写了是“某些情况”吧

是的,请见我在隔壁的回帖 —— 能解决部分问题总好过完全没有。

https://github.com/ArkMowers/arknights-mower/blob/2d69a52a30005cf96bc4761fcecd150ce2f914a4/arknights_mower/utils/solver.py#L496

https://github.com/ArkMowers/arknights-mower/blob/2d69a52a30005cf96bc4761fcecd150ce2f914a4/arknights_mower/solvers/sign_in.py#L127

https://github.com/ArkMowers/arknights-mower/blob/2d69a52a30005cf96bc4761fcecd150ce2f914a4/arknights_mower/utils/recognize.py#L81

而且你说的已经部分实装了。。。

目前确实已经有一部分异常检测了,包括一直处于未识别的场景(比如手动的战斗中)会退出方舟重启。但是当前还有很多场景不能正确重启,比如如主楼所说,它可能卡在商店页中,还有多次卡进了其他场景。

image
ZhaoZuohong commented 4 months ago

商店

https://github.com/ArkMowers/arknights-mower/commit/98965a9be090143503bc493e0980223bb849dc66

这个commit之后还遇到过卡在商店里的情况吗?

ZhaoZuohong commented 4 months ago

mower现在很多代码的写法都有问题,但好的写法是什么样的,还在探索

ZhaoZuohong commented 4 months ago

计时线程出错

mower根本没有计时线程,不知道你在说什么

lethefrost commented 4 months ago

商店

98965a9

这个commit之后还遇到过卡在商店里的情况吗?

这个有 commit 点近,如果之后出现了我再回这里反馈吧。但是前一周还有出现过卡在干员详情页的。

计时线程出错

mower根本没有计时线程,不知道你在说什么

我在说 schedule 线程在 sleep 的过程中出于某些未知原因到原本预计结束 sleep 的时候也没有恢复运作

ZhaoZuohong commented 4 months ago

原来 solver.py 里检测到公告之后有个盲点的操作

self.tap((1800,100))

主要是这个操作导致进了商店,现在公告识别从像素点计数改成模板匹配了,盲点也删了,就没这个问题了。

这个问题在QQ频道里有人反馈,前几天刚修

Screenshot_20240502-203009

ZhaoZuohong commented 4 months ago

群里两句话说清楚的事,你非要搁这写小作文

lethefrost commented 4 months ago

原来 solver.py 里检测到公告之后有个盲点的操作

self.tap((1800,100))

主要是这个操作导致进了商店,现在公告识别从像素点计数改成模板匹配了,盲点也删了,就没这个问题了。

这个问题在QQ频道里有人反馈,前几天刚修

Screenshot_20240502-203009

感谢修复;这个问题我遇到有一个来月了,但是一直也只是事后发现卡住了之后手动重启方舟和 mower 来解决,没有提 issue 或者去频道里报告(我相信还存在很多其他人遇到的大大小小的 bug,但是没有被提出解决的,可能是因为一开始几次以为是偶尔的个例,或者忙着没时间,还有用户不习惯反馈 bug),因此像我主楼里说的这样,对每个具体的 bug 情景做专门针对的适配和修复可能是有一些滞后性的,从发生到用户第一次提出,再到开发者处理修复,所以我才希望能有一个相对全面的、能在等到每个问题的具体解决方案之前暴力修复大部分卡死情景的临时解决方案,这样子如果一个人要出远门的时候就可以把 mower 挂在家里的电脑上,不用担心哪天卡死了之后就一直没法恢复。

ZhaoZuohong commented 4 months ago

https://github.com/ArkMowers/arknights-mower/blob/2d69a52a30005cf96bc4761fcecd150ce2f914a4/arknights_mower/utils/recognize.py#L336

这个函数不是才7行嘛,你的打字的功夫早看完了呀

ZhaoZuohong commented 4 months ago

schedule 线程

没有这个线程

ZhaoZuohong commented 4 months ago

哪天卡死了之后就一直没法恢复

网页面板,远程桌面

ZhaoZuohong commented 4 months ago

每个具体的 bug 情景做专门针对的适配和修复可能是有一些滞后性的

你有没有明白,这个bug是专门写出来的,那个时候我们没有懂识别的,临时凑合一下

ZhaoZuohong commented 4 months ago

这个问题我遇到有一个来月了

有问题不想着解决,却想办法绕过去,是什么鬼

lethefrost commented 4 months ago

每个具体的 bug 情景做专门针对的适配和修复可能是有一些滞后性的

你有没有明白,这个bug是专门写出来的,那个时候我们没有懂识别的,临时凑合一下

我不是说这一个 bug,是所有的可以通过重启方舟或者 mower 来恢复的 bug……在等待每个问题的针对性解决之前可以先暂时性的在陷入卡死之后提供恢复机制。

哪天卡死了之后就一直没法恢复

网页面板,远程桌面

所以为什么就一定要依赖外部工具呢,又要 helper 又要远程桌面等,如果 mower 本身能处理自己的异常不是更好……至少我如果加些这样的功能不会有坏处吧?用户也可以选择自己开或者不开?你到现在也没说我的提案到底有什么不可行或者负面影响啊,只是在说你觉得“扯”或者你觉得没有必要,那有了总没坏处吧?这点你可以确认一下吗?

schedule 线程

没有这个线程

base_scheduler……

啊啊啊 过几天 qq 再找你…今天是真没空了 😮‍💨

ZhaoZuohong commented 4 months ago

有了总没坏处吧

现在有连战,等着作战很有可能漏单,怎么就没坏处了

ZhaoZuohong commented 4 months ago

为什么就一定要依赖外部工具

mower相对于明日方舟来说本身就是外部工具

ZhaoZuohong commented 4 months ago

用户也可以选择自己开或者不开

作战中开始任务不强制退出而是等待战斗完成

之前你完全没提加选项的事啊

ZhaoZuohong commented 4 months ago

你到现在也没说我的提案到底有什么不可行或者负面影响啊

你也没说过啊,

当前只能识别prts代理录像的战斗场景,并且等待战斗完成后再开始任务;如果是手动战斗,则会被判定为未知场景并在尝试几次后重启游戏(肉鸽和生稀盐酸忘记看时间被弹出好多好多回了orz悲)

第一段讲mower的现状,还不全面

当前似乎是根据检索 ope_agency_going.png 等系列图形来判定是否作战中的?可否考虑改为检索左上角的齿轮图标、右下角费用图标、或者右上角二倍速/一倍速/暂停/继续等图标来实现更准确的作战判定?(敌人数量/目标生命似乎在生稀盐酸里不好使)

我目前对mower用的图像匹配和识别技术这块不太熟悉,上面提到的几个视觉元素都有点半透明效果(但是透明度不高),在不同的战斗场景中可能由于背景不同存在微小差异,这种情况会导致匹配失败吗?

第二第三段讲识别 加选项、利弊讨论完全没有啊,怎么怪我不说呢

ZhaoZuohong commented 4 months ago

你这些都不说,包括你说的不想借助mowerhelper也是刚才才说的,我自然觉得很扯啊

ZhaoZuohong commented 4 months ago

https://github.com/ArkMowers/arknights-mower/issues/551

你要是能像这个Issue这样,把话说明白,那也行,但你发的这俩都不太行,我是觉得看起来有困难