Skip to Content
Lua 自動化輪詢與監看

輪詢與監看

程式平常會在背景定時重新讀取一些暫存器,讓面板畫面保持更新(這就是「輪詢」); 使用者也可以把特定幾個位移加進「監看清單」,讓這幾個位移被特別盯著。這一頁介紹 腳本怎麼操作這兩件事,以及它們跟腳本執行之間的互動。

poll.on()/poll.off():開關背景輪詢

poll.off() -- 關閉背景輪詢這個開關 poll.on() -- 打開背景輪詢這個開關

這兩個函式做的事,跟畫面上手動下 poll off/poll on 指令完全一樣——是整個 程式的開關,不是只影響這支腳本,而且不會隨腳本結束自動復原。

⚠ 這兩個函式在腳本執行「期間」沒有任何可觀察的效果:背景輪詢本來就完全 不會在腳本執行的整段期間運作——不是因為它被 poll.off() 關掉了,是因為腳本 執行時,程式本來就沒有餘力去做背景輪詢這件事(不管這個開關是開是關都一樣, 下一頁「腳本執行的機制」會解釋原因)。所以在腳本裡的某個段落前後各呼叫一次 poll.off()/poll.on(),對那個段落本身不會有任何差別——不要以為這樣做 能讓那段期間更「乾淨」或更快。

這兩個函式唯一有意義的效果,是腳本結束之後背景輪詢是開是關——因為它跟 poll on/poll off 指令是同一個開關,而且不會隨腳本結束自動復原:如果腳本 呼叫了 poll.off()、之後沒有再呼叫 poll.on() 就結束了(不論是正常結束、 fail(),還是出錯或被中止),背景輪詢會維持在關閉狀態,就跟你自己手動下了 poll off 之後忘記開回來一樣,需要再手動(或用下一支腳本)呼叫 poll.on() 恢復。

watch.add/watch.remove/watch.clear:操作監看清單

watch.add(0x40) -- 把位移 0x40 加進目前分頁(掛載槽 0)的監看清單 watch.add(0x41, 1) -- 加進「掛載槽 1」自己的監看清單 watch.remove(0x40) -- 從掛載槽 0 的清單移除一個位移 watch.remove(0x41, 1) -- 從「掛載槽 1」自己的清單移除一個位移 watch.clear() -- 清空目前分頁全部掛載槽的監看清單

這幾個函式操作的,就是使用者平常在畫面上對監看面板做的同一份清單——腳本可以用 它們幫忙一次布置好一組要盯的位移,或是在測試前後清理掉不需要的項目。

watch.remove(offset [, slot]) 的 slot 語意與 watch.add(offset, slot) 對稱:省略時只作用在掛載槽 0,帶 slot 時只移除那個掛載槽自己的項目——上面 watch.remove(0x41, 1) 才移得到 watch.add(0x41, 1) 加進去的那一筆;想一次 清掉一個分頁底下所有掛載槽的項目,還是用 watch.clear()。清單已滿、或加入 的 (offset, slot) 組合已經存在,watch.add 都不會讓腳本出錯,只在 Log 留 一筆 WARN;watch.remove 找不到對應項目也只是安靜地不做事。⚠ 帶 slot 時, 那個掛載槽必須先設定過:watch.add(offset, slot)/watch.remove(offset, slot) 若指向一個從未設定過的掛載槽,會直接讓腳本出錯並中止,不會用位址 0x00 靜默生效——加之前先確認 slot 是不是真的設定過。細節見 API 參考。

跟腳本執行的互動

腳本執行的整段期間,程式會完全用來跑這支腳本,背景輪詢與監看面板本身的畫面 更新不會發生——不是因為它們被 poll.off() 關掉了,是因為腳本執行期間程式沒有 餘力去做別的事。下一頁「腳本執行的機制」會完整解釋這是怎麼一回事;這裡只要記得: 腳本裡呼叫 watch.add() 這類函式,效果是「把這個位移登記進清單」,清單真正被 拿出來讀、畫面真正更新,要等到腳本結束、程式恢復背景輪詢之後才會發生。

接下來

下一頁說明腳本執行時到底是怎麼一回事:為什麼執行中面板會暫停更新、大概能跑多快, 以及什麼時候該寫腳本、什麼時候該考慮寫一顆 Plugin。