植物大战僵尸吧 关注:561,198贴子:5,089,114

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

只看楼主收藏回复

标题还可输入0个字。


IP属地:美国1楼2023-12-09 21:13回复
    是的你没有看错,这不是标题党(
    这个神奇的工具就是Seml。
    Seml到底有多快?
    解释Seml是什么前,我们先看一组数据:

    上图为Seml与其它测试方法完成类似测试任务时的速度比较,其速度之快一目了然。它比BrainVsZombies快8倍,比常规AvZ跳帧快118倍,比游戏内置10倍速或RTvz都快约300倍。要知道BvZ只能用于测炸率,因此在此之前最快的通用测试框架是AvZ跳帧,而Seml的出现则改写了这一切。
    以过去两个规模极大的测试项目为例。零度在20年10月用RTvz测过1300万只小丑(/p/6999350869),以他自己给出的20s一波的估计,大概需要10867s,也就是3小时1分7秒。若用Seml,同样的测试只需跑35s。
    Reisen在今年用AvZ跳帧测试了561份刷新数据(cv25712266)。据他自己的估计,仅是PE红白/红激活的约70条数据就要跑50~60h。要测完全部500多份数据,粗略估算下来至少要500小时以上。即使用上多开大法(开10个PvZ窗口同时跑),耗时也只会缩短5倍左右,仍需~100小时。据rs自己说,他是在很长一段时间内每天跑一点才测完的;但如果用Seml,仅需4小时就可以全部跑完。
    今天,我们终于可以很高兴地说:以AvZ跳帧为基础测试手段的时代已经过去了。谁会想到,有朝一日AvZ也已不再是“最快科技”?在Seml的加持下,我们可以第一次真正实现数据自由。


    IP属地:美国2楼2023-12-09 21:14
    回复
      2025-06-13 14:49:52
      广告
      Seml为什么这么快?
      Seml,全称Survival Endless Markup Language,是笔者专为PvZ生存无尽模式设计的一套标记语言,可以用来表示用炮、用卡、智能用卡等键控炮阵里的常见操作。
      这当然不是事情的全部。Seml本身只是一种用于简洁表述操作的语言,而它之所以能用于测试,还要得益于PvZ Emulator(/dnartz/PvZ-Emulator)。
      PvZ Emulator是由 @testla (没错,就是那个24炮的作者。。)在20年5月发布的一个项目,通过IDA对PvZ可执行程序进行反汇编,将与SE战斗逻辑的部分提取出来,作为单独可运行的C++程序。这意味着使用PvZ Emulator,你可以模拟任何植物或僵尸,查询其坐标、状态等信息,并得到和游戏内一模一样的结果。更简单地说,有了PvZ Emulator,你就可以在不开游戏的情况下“玩”游戏。
      当然了,这里说的“玩”,是数据意义上的。PE里没有画面也没有音效,充其量只能用于数据模拟,但正因如此,它可以跳过游戏原本需要做的许多繁杂工作,达到更快的计算速度。
      不仅如此,由于它是纯粹的C++项目,因此很容易结合多线程,充分利用CPU多核进行并行计算。其实BvZ和PE在原理上是相通的,只是BvZ当年没有用多线程,而且只实现了和炸率相关的一小部分游戏逻辑,和PE相比局限太多了。


      IP属地:美国3楼2023-12-09 21:15
      回复
        使用Seml
        要使用Seml,需先确保你安装了 VSCode(用AvZ也需要这个,如果没有的话可参考AvZ安装教程的第一部分)。之后在插件商店里搜索并安装”Seml“即可。

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


        IP属地:美国4楼2023-12-09 21:16
        回复
          测试砸率
          新建任意以 .seml 结尾的文件。输入以下内容:
          # 测试 PE.垫材24 旧PDc解的砸率
          scene:PE
          protect:18 28 58 68 # 要保护的炮位
          repeat:300 # 测试选卡数 (可省略, 默认300), 每个选卡总计 1000 只红眼
          w 601
          PP 225 25 9
          C 539~619 1265 9
          w 601
          PP 225 25 9
          DD +107 15 8.1875
          C 539~619 1256 9
          w 601
          PP 225 25 9
          DD +107 15 8.1875
          C 539~619 1256 9
          使用 Ctrl + Shift + P 呼出命令菜单, 键入 测试砸率 即可.
          测试结果在当前目录dest文件夹下,为csv格式:


          IP属地:美国5楼2023-12-09 21:17
          回复
            第一个表是数据摘要:

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

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


            IP属地:美国6楼2023-12-09 21:18
            回复
              测试炮伤
              新建任意以 .seml 结尾的文件。输入以下内容:
              # 测试 NE 无铲炮伤 (分别于 776, 800, 824 垫的三种情况)
              scene:NE
              protect:18 28 38 48 58 # 要保护的炮位
              repeat:10000 # 测试波数 (可省略, 默认 10000), 每波梯/丑/橄/篮各 5 只
              SET x 776
              w1~3 0 1200~1500 # 完美预判冰, 记录 1200~1500cs 的数据, 共三种情况
              C_NUM x+266 1"234'5' 9
              SET x x+24
              使用 Ctrl + Shift + P 呼出命令菜单, 键入 测试炮伤 即可. 注意和 Simple AvZ 一样,冰为炮等效时间,即0冰是完美预判冰,10冰是Ice3. 理由请见此处的说明(cv26755303)。
              测试结果:

              (完整表格过长,这里只展示部分)
              炮伤、瞬伤、损伤的定义与单位请参见炮伤概论(cv14845012)。
              表格里列出了每个时刻下,不同操作情况的炮伤、瞬伤与损伤,并分别圈出了数值最小的一项。如上图,在t=1472时(也就是1672波),最佳垫材时机为800,可使炮伤最小。
              注意炮伤测试是将每一波拆开理解的,因为炮伤测试只涉及单波。上面的例子里输入了3个wave,结果便是比较这三种不同操作的炮伤。


              IP属地:美国7楼2023-12-09 21:19
              回复
                测试刷新
                常言道,砸率、炮伤、刷新意外率是炮阵的三座大山。既然砸率和炮伤都能测了,怎么能不支持测刷新呢?(
                仍旧新建任意 .seml 文件,输入以下内容:
                # 测试红白关 225 / 260 PP 刷新意外率
                scene:PE
                require:红白 # 必出的僵尸类型, 可用中文单字或英文四字缩写
                # ban: ... # 禁出的僵尸类型
                huge:false # true 为旗帜波, false 为普通波
                activate:true # true 为激活, false 为分离
                dance:true # true 为使用 dance cheat, false 为不使用
                repeat:1000 # 测试选卡数 (可省略, 默认 1000)
                w 601
                PP 225 25 9
                w 601
                PP 260 25 9
                使用 Ctrl + Shift + P 呼出命令菜单, 键入 测试刷新 即可.
                得到结果如下:

                上面是测试设定。下面则列出了平均意外率,以及不同出怪组合下的意外率,由大到小排布。这样用户可以根据僵尸种类的分布情况,进行进一步的分类讨论。
                例如由上图,PP225处可见,高延迟的组合全部都不包含橄榄,所以我们可以推断若橄榄存在,则翻车概率会很低。之后可以在require里加上橄榄,进一步测试等等。
                和炮伤测试类似,刷新测试也是将每一波拆开来看的。
                填写僵尸类型时,Seml支持中文单字或英文四字缩写,如下:


                IP属地:美国8楼2023-12-09 21:20
                回复
                  2025-06-13 14:43:52
                  广告
                  测试跳跳
                  新建 .seml 文件,输入:
                  # 测试后院有 5炮 7炮 时全收跳跳的最大波次
                  scene:PE
                  protect:15 17 # 场上存在的炮, 只有列数会被用到, 无需提供多行
                  repeat:1000 # 测试波数 (可省略, 默认 1000), 每波 1000 只跳跳
                  w 0 1200~1800 # 完美预判冰, 记录 1200~1800cs 的数据
                  # 如果测试屋顶场合, 这里需要加一个用炮操作
                  # 如 P3 300 2 9, 代表考虑的炮尾列 (其它参数不会用到)
                  使用 Ctrl + Shift + P 呼出命令菜单, 键入 测试跳跳 即可.
                  测试结果:

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


                  IP属地:美国9楼2023-12-09 21:21
                  回复
                    完整API
                    Seml支持用炮、用卡、智能用卡等操作,涵盖了实际用到的大部分操作。其具体API请见 VSCode 插件商店中 Seml 的页面。
                    此外,安装Seml插件后编辑.seml文件时,会自动提供语法高亮,哪些地方不合语法一目了然。若语句有误,执行命令时也会有人性化报错。
                    反馈问题
                    尽管作者为每种测试都设计了多个测试情况,并在发布前进行检查,但这仍然无法确保Seml不会出现这样那样的问题。
                    如果使用时遇到障碍,或认为得到的数据有误,可以直接联系我,或在Seml的repo(Rottenham/seml)下提请issue。
                    如果你是用户,你可能会想问,我怎么知道PvZ Emulator没有潜在的bug?这的确是个好问题。要证明它完全没有bug是困难的,实质上是不可能的,但目前Seml提供的四种测试(砸率、炮伤、刷新、跳跳)都使用了以其它途径得到的数据进行验证,结果都是吻合的。在今后开发时,笔者也会遵循先用AvZ或其它基于原生游戏的工具进行小范围测算,再依此检查PE正确性的基本思路。


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


                      IP属地:美国11楼2023-12-09 21:22
                      回复
                        sofa


                        IP属地:北京来自Android客户端12楼2023-12-09 21:25
                        回复
                          abandon


                          IP属地:湖南13楼2023-12-09 21:29
                          回复
                            floor


                            IP属地:山西来自Android客户端14楼2023-12-09 21:50
                            回复
                              2025-06-13 14:37:52
                              广告
                              膜渐强


                              IP属地:广东来自Android客户端15楼2023-12-10 00:01
                              回复