Lazuplis-Mei / pvzclass

pvzclass 是一个用于控制植物大战僵尸游戏内部运行实体的一套框架
234 stars 56 forks source link

关于事件的三种实现方式 #65

Closed Moon-404 closed 1 year ago

Moon-404 commented 1 year ago

经过 Shade_Joker 的提醒,我得知还可以使用中断来实现事件机制,现在已经完成了 demo,详见:https://github.com/Moon-404/pvzclass/tree/DebugEvents

目前就一共有三种事件的实现方式了,我觉得是时候讨论一下选择哪一种方式继续开发下去,并且我想把其它的实现方式全部从仓库中删除,这样保持了代码的精简。

  1. 基于定期扫描内存的事件开发方式。优点:没有对 PVZ 程序进行修改。缺点:容易漏事件。
  2. 基于 hook 的事件开发方式。优点:不会漏事件;两个进程相对独立,仅通过特定内存地址进行通信。缺点:开发需要额外编写汇编码;本质是两个 while 循环互相等待,存在资源的浪费;需要修改 PVZ 程序,可能影响其它修改器或代码。
  3. 基于 debug 的事件开发方式。优点:不需要寻找和编写 hook 的汇编码,开发迅捷;不存在 while 等待;不会修改 PVZ 程序。缺点:只能同时存在一个 debug 进程,提前关闭程序会导致 PVZ 被连带关闭。

从我的体验上来讲,debug 确实是最好的方式了。同时存在一个进程的问题我认为可以后期将 pvzclass 作为模组启动器那样子开发来解决(就像 forge),但是按照目前 pvzclass 的使用规模来看,基本上没有需要同时使用多个程序的使用场景,所以我认为它的缺点暂时不是缺点。

Violet-Nonbloosom commented 1 year ago

虽然我个人比较看好第三种方案的想法,但目前我测试第三种方案的 demo,偶尔会出现数据不正常,随后出现程序和 PVZ 本体均卡死的漏洞。 所以我暂且支持第二种方案,至少它的问题更多影响的是扩充它的人,而对使用者影响没那么大。 第一种方案确实没有继续存在的必要了。新的方案选定后,我会把它相关的代码剔掉。

Moon-404 commented 1 year ago

虽然我个人比较看好第三种方案的想法,但目前我测试第三种方案的 demo,偶尔会出现数据不正常,随后出现程序和 PVZ 本体均卡死的漏洞。 所以我暂且支持第二种方案,至少它的问题更多影响的是扩充它的人,而对使用者影响没那么大。 第一种方案确实没有继续存在的必要了。新的方案选定后,我会把它相关的代码剔掉。

我初步尝试了修复,详见:https://github.com/Moon-404/pvzclass/commit/a8f1c809264c8475083390c373105bf0f2ea3d56

另外,第一个方案的代码可以开始移除了,一确实太不稳定了。

Violet-Nonbloosom commented 1 year ago

虽然我个人比较看好第三种方案的想法,但目前我测试第三种方案的 demo,偶尔会出现数据不正常,随后出现程序和 PVZ 本体均卡死的漏洞。 所以我暂且支持第二种方案,至少它的问题更多影响的是扩充它的人,而对使用者影响没那么大。 第一种方案确实没有继续存在的必要了。新的方案选定后,我会把它相关的代码剔掉。

我初步尝试了修复,详见:Moon-404@a8f1c80

另外,第一个方案的代码可以开始移除了,一确实太不稳定了。

我这边测试效果还不错,至少没有产生新的崩溃。

切换 3D 加速会使 PVZ 崩掉,可能只是 PVZ 本体自己不兼容的问题,暂时可以忽略。

可以考虑更大范围的测试了。

Moon-404 commented 1 year ago

我刚刚制作了植物射击事件与子弹创建事件,经过排山倒海小游戏的测试没有发现问题。

基于断点的开发方式非常方便,每个事件只需要十分钟便可开发完毕,我认为可以以方式三作为主力方式进行开发了。