Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
lethefrost opened this issue May 1, 2024 · 25 comments

Comments

@lethefrost
Copy link
Contributor

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

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

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

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

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

设置项

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

触发条件和重启逻辑

  • 初始化任务记录为空。
  • 每次休息结束开始工作的时候记录一个本轮开始的时间戳。
  • 每经过一次检测间隔的时长,触发一次检查
    1. 检查当前任务序列中的第一个任务,(处理被第一条任务无法完成所阻塞的情况,但是无法正确识别出多个任务构成的死循环)
    2. 检查本轮运行时长,如果超过单轮允许的上限则重启 mower (正常情况下运行通常一轮不会过久,这条用于应对卡进反复添加多条任务的循环无法结束的情况)

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

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

@ZhaoZuohong
Copy link
Contributor

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

@ZhaoZuohong ZhaoZuohong closed this as not planned Won't fix, can't repro, duplicate, stale May 1, 2024
@lethefrost
Copy link
Contributor Author

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

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

@ZhaoZuohong
Copy link
Contributor

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

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

@ZhaoZuohong
Copy link
Contributor

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

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

@ZhaoZuohong
Copy link
Contributor

if now - start_time > timedelta(minutes=1):

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

@lethefrost
Copy link
Contributor Author

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

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

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

if now - start_time > timedelta(minutes=1):

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

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

image

@ZhaoZuohong
Copy link
Contributor

商店

98965a9

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

@ZhaoZuohong
Copy link
Contributor

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

@ZhaoZuohong
Copy link
Contributor

计时线程出错

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

@lethefrost
Copy link
Contributor Author

商店

98965a9

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

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

计时线程出错

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

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

@ZhaoZuohong
Copy link
Contributor

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

self.tap((1800,100))

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

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

Screenshot_20240502-203009

@ZhaoZuohong
Copy link
Contributor

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

@lethefrost
Copy link
Contributor Author

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

self.tap((1800,100))

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

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

Screenshot_20240502-203009

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

@ZhaoZuohong
Copy link
Contributor

def find_ra_battle_exit(self) -> bool:

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

@ZhaoZuohong
Copy link
Contributor

schedule 线程

没有这个线程

@ZhaoZuohong
Copy link
Contributor

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

网页面板,远程桌面

@ZhaoZuohong
Copy link
Contributor

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

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

@ZhaoZuohong
Copy link
Contributor

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

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

@lethefrost
Copy link
Contributor Author

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

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

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

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

网页面板,远程桌面

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

schedule 线程

没有这个线程

base_scheduler……

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

@ZhaoZuohong
Copy link
Contributor

有了总没坏处吧

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

@ZhaoZuohong
Copy link
Contributor

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

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

@ZhaoZuohong
Copy link
Contributor

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

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

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

@ZhaoZuohong
Copy link
Contributor

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

你也没说过啊,

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

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

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

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

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

@ZhaoZuohong
Copy link
Contributor

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

@ZhaoZuohong
Copy link
Contributor

#551

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants