欢迎光临散文网 会员登陆 & 注册

同一个工具既能测砸率,又能测炮伤、刷新,还比AvZ跳帧快100倍!?

2023-11-23 10:06 作者:Crescebdo  | 我要投稿

是的你没有看错,这不是标题党(

这个神奇的工具就是Seml

 

 

Seml到底有多快?


解释Seml是什么前,我们先看一组数据:



上图为Seml与其它测试方法完成类似测试任务时的速度比较,其速度之快一目了然。它比BrainVsZombies快8倍,比常规AvZ跳帧快118倍,比游戏内置10倍速或RTvz都快约300倍。要知道BvZ只能用于测炸率,因此在此之前最快的通用测试框架是AvZ跳帧,而Seml的出现则改写了这一切。


以过去两个规模极大的测试项目为例。零度在20年10月用RTvz测过1300万只小丑(https://tieba.baidu.com/p/6999350869),以他自己给出的20s一波的估计,大概需要10867s,也就是3小时1分7秒。若用Seml,同样的测试只需跑35s


Reisen在今年用AvZ跳帧测试了561份刷新数据。据他自己的估计,仅是PE红白/红激活的约70条数据就要跑50~60h。要测完全部500多份数据,粗略估算下来至少要500小时以上。即使用上多开大法(开10个PvZ窗口同时跑),耗时也只会缩短5倍左右,仍需~100小时。据rs自己说,他是在很长一段时间内每天跑一点才测完的;但如果用Seml,仅需4小时就可以全部跑完。


今天,我们终于可以很高兴地说:以AvZ跳帧为基础测试手段的时代已经过去了。谁会想到,有朝一日AvZ也已不再是“最快科技”?在Seml的加持下,我们可以第一次真正实现数据自由。

 

 

Seml为什么这么快?


Seml,全称Survival Endless Markup Language,是笔者专为PvZ生存无尽模式设计的一套标记语言,可以用来表示用炮、用卡、智能用卡等键控炮阵里的常见操作。


这当然不是事情的全部。Seml本身只是一种用于简洁表述操作的语言,而它之所以能用于测试,还要得益于PvZ Emulator


https://github.com/dnartz/PvZ-Emulator


PvZ Emulator是由testla(没错,就是那个24炮的作者。。)在20年5月发布的一个项目,通过IDA对PvZ可执行程序进行反汇编,将与SE战斗逻辑的部分提取出来,作为单独可运行的C++程序。这意味着使用PvZ Emulator,你可以模拟任何植物或僵尸,查询其坐标、状态等信息,并得到和游戏内一模一样的结果。更简单地说,有了PvZ Emulator,你就可以在不开游戏的情况下“玩”游戏。


当然了,这里说的“玩”,是数据意义上的。PE里没有画面也没有音效,充其量只能用于数据模拟,但正因如此,它可以跳过游戏原本需要做的许多繁杂工作,达到更快的计算速度。


不仅如此,由于它是纯粹的C++项目,因此很容易结合多线程,充分利用CPU多核进行并行计算。其实BvZ和PE在原理上是相通的,只是BvZ当年没有用多线程,而且只实现了和炸率相关的一小部分游戏逻辑,和PE相比局限太多了。

 

 

使用Seml


要使用Seml,需先确保你安装了 VSCode(用AvZ也需要这个,如果没有的话可参考AvZ安装教程的第一部分)。之后在插件商店里搜索并安装”Seml“即可。



下面给出几个常用测试的示例文件。

  

  

测试砸率


新建任意以 .seml 结尾的文件。输入以下内容:


使用 Ctrl + Shift + P 呼出命令菜单, 键入 测试砸率 即可.


测试结果在当前目录dest文件夹下,为csv格式:


第一个表是数据摘要:


列出了每个测试位置的砸率。注意这里的单位是单波砸率,也就是每5只红眼砸几次,范围为0%~500%。以1.37%为例,含义为100波(500红)平均砸1.37次。


第二个表为详细数据:


列出了玩家侧的各个操作。HIT代表这些红眼受到了该操作影响(被炸到/被垫到),MISS代表没有。如图所示,连续PDc里有砸率的是在w1出生,被w1垫材垫到,但没有被w2垫材垫到的巨人们。这也符合常理,因为这些巨人速度太快,w2垫之前已对炮举锤。

 

 

测试炮伤


新建任意以 .seml 结尾的文件。输入以下内容:


使用 Ctrl + Shift + P 呼出命令菜单, 键入 测试炮伤 即可. 注意和 Simple AvZ 一样,冰为炮等效时间,即0冰是完美预判冰,10冰是Ice3. 理由请见此处的说明


测试结果:

完整表格过长,这里只展示部分


炮伤、瞬伤、损伤的定义与单位请参见炮伤概论


表格里列出了每个时刻下,不同操作情况的炮伤、瞬伤与损伤,并分别圈出了数值最小的一项。如上图,在t=1472时(也就是1672波),最佳垫材时机为800,可使炮伤最小。


注意炮伤测试是将每一波拆开理解的,因为炮伤测试只涉及单波。上面的例子里输入了3个wave,结果便是比较这三种不同操作的炮伤。

 

 

测试刷新


常言道,砸率、炮伤、刷新意外率是炮阵的三座大山。既然砸率和炮伤都能测了,怎么能不支持测刷新呢?(


仍旧新建任意 .seml 文件,输入以下内容:



使用 Ctrl + Shift + P 呼出命令菜单, 键入 测试刷新 即可.


得到结果如下:

完整表格过长,这里只展示部分


上面是测试设定。下面则列出了平均意外率,以及不同出怪组合下的意外率,由大到小排布。这样用户可以根据僵尸种类的分布情况,进行进一步的分类讨论。


例如由上图,PP225处可见,高延迟的组合全部都不包含橄榄,所以我们可以推断若橄榄存在,则翻车概率会很低。之后可以在require里加上橄榄,进一步测试等等。


和炮伤测试类似,刷新测试也是将每一波拆开来看的。


填写僵尸类型时,Seml支持中文单字或英文四字缩写,如下:

 

 

测试跳跳


新建 .seml 文件,输入:


使用 Ctrl + Shift + P 呼出命令菜单, 键入 测试跳跳 即可.


测试结果:

完整表格过长,这里只展示部分


这个是最好理解的,OK就是收得了,ERROR就是收不了。左边是收跳跳的最右炸点,或收巨人的最左炸点。注意都是炸点,因此除以80后就可以直接在脚本里使用。

 

 

完整API


Seml支持用炮、用卡、智能用卡等操作,涵盖了实际用到的大部分操作。其具体API请见:https://marketplace.visualstudio.com/items?itemName=Crescendo.seml。


此外,安装Seml插件后编辑.seml文件时,会自动提供语法高亮,哪些地方不合语法一目了然。若语句有误,执行命令时也会有人性化报错。

 

 

反馈问题


尽管作者为每种测试都设计了多个测试情况,并在发布前进行检查,但这仍然无法确保Seml不会出现这样那样的问题。


如果使用时遇到障碍,或认为得到的数据有误,可以直接联系我,或在Seml的repo(https://github.com/Rottenham/seml)下提请issue。


如果你是用户,你可能会想问,我怎么知道PvZ Emulator没有潜在的bug?这的确是个好问题。要证明它完全没有bug是困难的,实质上是不可能的,但目前Seml提供的四种测试(砸率、炮伤、刷新、跳跳)都使用了以其它途径得到的数据进行验证,结果都是吻合的。在今后开发时,笔者也会遵循先用AvZ或其它基于原生游戏的工具进行小范围测算,再依此检查PE正确性的基本思路。

 

 

写在最后


从Seml立项(今年10/1),到如今基本完善,竟已过去了近2个月时间。在这里笔者必修要感谢testla,没有他开发的强大的PE,就不会有今天的Seml。这里也要感谢其他为Seml的发展提出过宝贵建议的群友们。最后我想说,AvZ终于可以回归它原本的用途,也就是键控框架了。其背后的原因真令人暖心。

同一个工具既能测砸率,又能测炮伤、刷新,还比AvZ跳帧快100倍!?的评论 (共 条)

分享到微博请遵守国家法律