Class PetLootProcessor
java.lang.Object
handling.channel.handler.PetLootProcessor
寵物自動撿取(寵吸)的非同步處理器。
當伺服器同時在線人數多、且地圖上掉落道具大量堆積時,原本在 Netty 事件迴圈
(封包執行緒)上同步執行的「全地圖道具掃描」(MapleMap.getMapObjectsInRange(Point, double))
會成為瓶頸:掃描成本與地圖道具總數成正比,且需持有 ITEM 讀鎖,導致事件迴圈被卡住、
連帶拖慢同一條 worker 執行緒上其他玩家的封包處理(卡頓)。
本處理器把「昂貴且唯讀」的道具掃描丟到專用執行緒池平行處理,掃描完成後再將
「實際撿取」(修改背包/楓幣)排回該玩家自己的事件迴圈執行——因為背包
(MapleInventory 底層是非執行緒安全的 LinkedHashMap)
必須與該玩家其他封包序列化,不能在別的執行緒並行修改。
每位玩家同時最多只有一個掃描在途(INFLIGHT 去重),形成天然背壓:
寵物移動封包很頻繁,若上一輪掃描尚未完成就直接略過本次,下一次移動會再觸發;
漏掉一次掃描對自動撿取無實質影響。道具數量低於 ASYNC_THRESHOLD 的地圖
仍走原本的同步路徑(零執行緒切換成本,行為與改版前一致)。
-
Method Summary
Modifier and TypeMethodDescriptionstatic voidprocess(MapleCharacter chr, int index, List<LifeMovementFragment> res) 在玩家事件迴圈上呼叫:依地圖道具數量決定走同步或非同步路徑處理一次寵物自動撿取。
-
Method Details
-
process
在玩家事件迴圈上呼叫:依地圖道具數量決定走同步或非同步路徑處理一次寵物自動撿取。- Parameters:
chr- 寵物的主人角色index- 觸發撿取的寵物索引res- 本次寵物移動的位移片段(決定撿取判定座標)
-