同一個(gè)工具既能測(cè)砸率,又能測(cè)炮傷、刷新,還比AvZ跳幀快100倍?。?/h1>
是的你沒(méi)有看錯(cuò),這不是標(biāo)題黨(
這個(gè)神奇的工具就是Seml。
?
?

Seml到底有多快?
解釋Seml是什么前,我們先看一組數(shù)據(jù):

上圖為Seml與其它測(cè)試方法完成類似測(cè)試任務(wù)時(shí)的速度比較,其速度之快一目了然。它比BrainVsZombies快8倍,比常規(guī)AvZ跳幀快118倍,比游戲內(nèi)置10倍速或RTvz都快約300倍。要知道BvZ只能用于測(cè)炸率,因此在此之前最快的通用測(cè)試框架是AvZ跳幀,而Seml的出現(xiàn)則改寫了這一切。
以過(guò)去兩個(gè)規(guī)模極大的測(cè)試項(xiàng)目為例。零度在20年10月用RTvz測(cè)過(guò)1300萬(wàn)只小丑(https://tieba.baidu.com/p/6999350869),以他自己給出的20s一波的估計(jì),大概需要10867s,也就是3小時(shí)1分7秒。若用Seml,同樣的測(cè)試只需跑35s。
Reisen在今年用AvZ跳幀測(cè)試了561份刷新數(shù)據(jù)。據(jù)他自己的估計(jì),僅是PE紅白/紅激活的約70條數(shù)據(jù)就要跑50~60h。要測(cè)完全部500多份數(shù)據(jù),粗略估算下來(lái)至少要500小時(shí)以上。即使用上多開大法(開10個(gè)PvZ窗口同時(shí)跑),耗時(shí)也只會(huì)縮短5倍左右,仍需~100小時(shí)。據(jù)rs自己說(shuō),他是在很長(zhǎng)一段時(shí)間內(nèi)每天跑一點(diǎn)才測(cè)完的;但如果用Seml,僅需4小時(shí)就可以全部跑完。
今天,我們終于可以很高興地說(shuō):以AvZ跳幀為基礎(chǔ)測(cè)試手段的時(shí)代已經(jīng)過(guò)去了。誰(shuí)會(huì)想到,有朝一日AvZ也已不再是“最快科技”?在Seml的加持下,我們可以第一次真正實(shí)現(xiàn)數(shù)據(jù)自由。
?
?

Seml為什么這么快?
Seml,全稱Survival Endless Markup Language,是筆者專為PvZ生存無(wú)盡模式設(shè)計(jì)的一套標(biāo)記語(yǔ)言,可以用來(lái)表示用炮、用卡、智能用卡等鍵控炮陣?yán)锏某R姴僮鳌?/p>
這當(dāng)然不是事情的全部。Seml本身只是一種用于簡(jiǎn)潔表述操作的語(yǔ)言,而它之所以能用于測(cè)試,還要得益于PvZ Emulator。

PvZ Emulator是由testla(沒(méi)錯(cuò),就是那個(gè)24炮的作者。。)在20年5月發(fā)布的一個(gè)項(xiàng)目,通過(guò)IDA對(duì)PvZ可執(zhí)行程序進(jìn)行反匯編,將與SE戰(zhàn)斗邏輯的部分提取出來(lái),作為單獨(dú)可運(yùn)行的C++程序。這意味著使用PvZ Emulator,你可以模擬任何植物或僵尸,查詢其坐標(biāo)、狀態(tài)等信息,并得到和游戲內(nèi)一模一樣的結(jié)果。更簡(jiǎn)單地說(shuō),有了PvZ Emulator,你就可以在不開游戲的情況下“玩”游戲。
當(dāng)然了,這里說(shuō)的“玩”,是數(shù)據(jù)意義上的。PE里沒(méi)有畫面也沒(méi)有音效,充其量只能用于數(shù)據(jù)模擬,但正因如此,它可以跳過(guò)游戲原本需要做的許多繁雜工作,達(dá)到更快的計(jì)算速度。
不僅如此,由于它是純粹的C++項(xiàng)目,因此很容易結(jié)合多線程,充分利用CPU多核進(jìn)行并行計(jì)算。其實(shí)BvZ和PE在原理上是相通的,只是BvZ當(dāng)年沒(méi)有用多線程,而且只實(shí)現(xiàn)了和炸率相關(guān)的一小部分游戲邏輯,和PE相比局限太多了。
?
?

使用Seml
要使用Seml,需先確保你安裝了 VSCode(用AvZ也需要這個(gè),如果沒(méi)有的話可參考AvZ安裝教程的第一部分)。之后在插件商店里搜索并安裝”Seml“即可。

下面給出幾個(gè)常用測(cè)試的示例文件。
??
??

測(cè)試砸率
新建任意以 .seml 結(jié)尾的文件。輸入以下內(nèi)容:
使用 Ctrl + Shift + P 呼出命令菜單, 鍵入 測(cè)試砸率 即可.
測(cè)試結(jié)果在當(dāng)前目錄dest文件夾下,為csv格式:

第一個(gè)表是數(shù)據(jù)摘要:

列出了每個(gè)測(cè)試位置的砸率。注意這里的單位是單波砸率,也就是每5只紅眼砸?guī)状危秶鸀?%~500%。以1.37%為例,含義為100波(500紅)平均砸1.37次。
第二個(gè)表為詳細(xì)數(shù)據(jù):

列出了玩家側(cè)的各個(gè)操作。HIT代表這些紅眼受到了該操作影響(被炸到/被墊到),MISS代表沒(méi)有。如圖所示,連續(xù)PDc里有砸率的是在w1出生,被w1墊材墊到,但沒(méi)有被w2墊材墊到的巨人們。這也符合常理,因?yàn)檫@些巨人速度太快,w2墊之前已對(duì)炮舉錘。
?
?

測(cè)試炮傷
新建任意以 .seml 結(jié)尾的文件。輸入以下內(nèi)容:
使用 Ctrl + Shift + P 呼出命令菜單, 鍵入 測(cè)試炮傷?即可. 注意和 Simple AvZ 一樣,冰為炮等效時(shí)間,即0冰是完美預(yù)判冰,10冰是Ice3. 理由請(qǐng)見此處的說(shuō)明。
測(cè)試結(jié)果:

炮傷、瞬傷、損傷的定義與單位請(qǐng)參見炮傷概論。
表格里列出了每個(gè)時(shí)刻下,不同操作情況的炮傷、瞬傷與損傷,并分別圈出了數(shù)值最小的一項(xiàng)。如上圖,在t=1472時(shí)(也就是1672波),最佳墊材時(shí)機(jī)為800,可使炮傷最小。
注意炮傷測(cè)試是將每一波拆開理解的,因?yàn)榕趥麥y(cè)試只涉及單波。上面的例子里輸入了3個(gè)wave,結(jié)果便是比較這三種不同操作的炮傷。
?
?

測(cè)試刷新
常言道,砸率、炮傷、刷新意外率是炮陣的三座大山。既然砸率和炮傷都能測(cè)了,怎么能不支持測(cè)刷新呢?(
仍舊新建任意 .seml 文件,輸入以下內(nèi)容:
使用 Ctrl + Shift + P 呼出命令菜單, 鍵入 測(cè)試刷新 即可.
得到結(jié)果如下:

上面是測(cè)試設(shè)定。下面則列出了平均意外率,以及不同出怪組合下的意外率,由大到小排布。這樣用戶可以根據(jù)僵尸種類的分布情況,進(jìn)行進(jìn)一步的分類討論。
例如由上圖,PP225處可見,高延遲的組合全部都不包含橄欖,所以我們可以推斷若橄欖存在,則翻車概率會(huì)很低。之后可以在require里加上橄欖,進(jìn)一步測(cè)試等等。
和炮傷測(cè)試類似,刷新測(cè)試也是將每一波拆開來(lái)看的。
填寫僵尸類型時(shí),Seml支持中文單字或英文四字縮寫,如下:

?
?

測(cè)試跳跳
新建 .seml 文件,輸入:
使用 Ctrl + Shift + P 呼出命令菜單, 鍵入 測(cè)試跳跳 即可.
測(cè)試結(jié)果:

這個(gè)是最好理解的,OK就是收得了,ERROR就是收不了。左邊是收跳跳的最右炸點(diǎn),或收巨人的最左炸點(diǎn)。注意都是炸點(diǎn),因此除以80后就可以直接在腳本里使用。
?
?

完整API
Seml支持用炮、用卡、智能用卡等操作,涵蓋了實(shí)際用到的大部分操作。其具體API請(qǐng)見:https://marketplace.visualstudio.com/items?itemName=Crescendo.seml。
此外,安裝Seml插件后編輯.seml文件時(shí),會(huì)自動(dòng)提供語(yǔ)法高亮,哪些地方不合語(yǔ)法一目了然。若語(yǔ)句有誤,執(zhí)行命令時(shí)也會(huì)有人性化報(bào)錯(cuò)。
?
?

反饋問(wèn)題
盡管作者為每種測(cè)試都設(shè)計(jì)了多個(gè)測(cè)試情況,并在發(fā)布前進(jìn)行檢查,但這仍然無(wú)法確保Seml不會(huì)出現(xiàn)這樣那樣的問(wèn)題。
如果使用時(shí)遇到障礙,或認(rèn)為得到的數(shù)據(jù)有誤,可以直接聯(lián)系我,或在Seml的repo(https://github.com/Rottenham/seml)下提請(qǐng)issue。
如果你是用戶,你可能會(huì)想問(wèn),我怎么知道PvZ Emulator沒(méi)有潛在的bug?這的確是個(gè)好問(wèn)題。要證明它完全沒(méi)有bug是困難的,實(shí)質(zhì)上是不可能的,但目前Seml提供的四種測(cè)試(砸率、炮傷、刷新、跳跳)都使用了以其它途徑得到的數(shù)據(jù)進(jìn)行驗(yàn)證,結(jié)果都是吻合的。在今后開發(fā)時(shí),筆者也會(huì)遵循先用AvZ或其它基于原生游戲的工具進(jìn)行小范圍測(cè)算,再依此檢查PE正確性的基本思路。
?
?

寫在最后
從Seml立項(xiàng)(今年10/1),到如今基本完善,竟已過(guò)去了近2個(gè)月時(shí)間。在這里筆者必修要感謝testla,沒(méi)有他開發(fā)的強(qiáng)大的PE,就不會(huì)有今天的Seml。這里也要感謝其他為Seml的發(fā)展提出過(guò)寶貴建議的群友們。最后我想說(shuō),AvZ終于可以回歸它原本的用途,也就是鍵控框架了。其背后的原因真令人暖心。