Class PetLootProcessor

java.lang.Object
handling.channel.handler.PetLootProcessor

public final class PetLootProcessor extends Object
寵物自動撿取(寵吸)的非同步處理器。

當伺服器同時在線人數多、且地圖上掉落道具大量堆積時,原本在 Netty 事件迴圈 (封包執行緒)上同步執行的「全地圖道具掃描」(MapleMap.getMapObjectsInRange(Point, double)) 會成為瓶頸:掃描成本與地圖道具總數成正比,且需持有 ITEM 讀鎖,導致事件迴圈被卡住、 連帶拖慢同一條 worker 執行緒上其他玩家的封包處理(卡頓)。

本處理器把「昂貴且唯讀」的道具掃描丟到專用執行緒池平行處理,掃描完成後再將 「實際撿取」(修改背包/楓幣)排回該玩家自己的事件迴圈執行——因為背包 (MapleInventory 底層是非執行緒安全的 LinkedHashMap) 必須與該玩家其他封包序列化,不能在別的執行緒並行修改。

每位玩家同時最多只有一個掃描在途(INFLIGHT 去重),形成天然背壓: 寵物移動封包很頻繁,若上一輪掃描尚未完成就直接略過本次,下一次移動會再觸發; 漏掉一次掃描對自動撿取無實質影響。道具數量低於 ASYNC_THRESHOLD 的地圖 仍走原本的同步路徑(零執行緒切換成本,行為與改版前一致)。

  • Method Details

    • process

      public static void process(MapleCharacter chr, int index, List<LifeMovementFragment> res)
      在玩家事件迴圈上呼叫:依地圖道具數量決定走同步或非同步路徑處理一次寵物自動撿取。
      Parameters:
      chr - 寵物的主人角色
      index - 觸發撿取的寵物索引
      res - 本次寵物移動的位移片段(決定撿取判定座標)