從此不再等待空房間!MatchMaker 配對系統正式上線

MatchMaker,全新的配對機制
我們正式實裝了新的 MatchMaker 配對系統。
過去玩家在選擇地圖後,會被分到到該張地圖的 Arena。當時,我們的做法是「一個地圖掛載一個 Arena」。
當同一張地圖只有一個遊戲實例時,這件事情並不複雜。但隨著 單挑模式 的出現,我們意識到原先的這個做法,使得只有一組玩家能夠進行遊玩,剩餘的玩家都必須等待該競技場清空才得以遊玩。
假設兩名玩家正在 古拉格 進行遊戲,那麼這張地圖所對應的 Arena 就會進入遊戲狀態。此時,若還有其他玩家也想遊玩 古拉格,他們仍然必須等待前一場正在進行的遊戲結束、Arena 被重置之後,才能開始下一場遊戲。
因此,我們希望讓「地圖」與「遊戲實例」不再是一對一的關係;而是能夠變成 One Map Multiple Instances 的型態。
同一張地圖現在可以同時存在多個 Arena 實例,而玩家只需要選擇自己想玩的地圖,至於究竟該加入哪一個 Arena、什麼時候需要建立新的 Arena,則全部交給新的 MatchMaker 處理。
從「選 Arena」變成「選地圖」
這次改動其中一個重要的概念,就是將玩家的選擇目標從「Arena」變成「地圖模板」。
在這裡,我們要先定義一下 Map 與 Arena 的區別:
- Map: 顧名思義,代表地圖。你在遊戲選擇地圖的 GUI 中所見的選項都是 Map
- Arena: 代表的是 Instance,掛載於 Map 之下。可以簡單理解為 Map 的不同房間。
例如一位玩家在 GUI 中點擊 迫降陣地 時,代表的是「他想玩這張地圖」。
而至於該讓玩家加入哪個 Arena,則由 MatchMaker 進行操作。
MatchMaker 會尋找所有以 迫降陣地 為模板建立的 Arena:
迫降陣地
├── Arena_01 COUNTDOWN 8/10
├── Arena_02 LIVE 4/10
└── Arena_03 WAITING 0/10
MatchMaker 在策略上用了一個簡單的貪心算法。
不是隨機挑選一個 Arena,而是會優先搜尋目前處於「可加入狀態」且尚未滿人的 Arena。
而若同時有多個符合上述條件的 Arena,則會優先選擇玩家數量最多的那一個。
以上面的例子來說,玩家會被優先分配至 Arena_01,而不是空著的 Arena_03。
如此一來,就可以盡可能地將單一一個最具期望的房間湊滿,最大化該 Arena 的人數。
那麼,沒有 Arena 可以加入怎麼辦?
我最討厭像你這種直覺敏銳的小鬼了
不過,這也是本次 MatchMaker 相當重要的核心之一。
假設現在的情況變成:
迫降陣地
├── Arena_01 LIVE 8/10
└── Arena_02 LIVE 2/10
過去的配對機制,在這種情形下就沒有其他選擇了。
玩家只能等待。WAIT Network。
但現在,MatchMaker 在找不到任何可加入的 Arena 時,會請求建立一個新的 Arena Instance。
例如:
迫降陣地 ├── Arena_01 LIVE 8/10 ├── Arena_02 LIVE 2/10 └── Arena_03 WAITING 0/10 ← NEW One
新的 Arena 建立完成後,玩家就可以直接加入 Arena_03,而不需要等待前面的遊戲結束。
而對於那些已經結束的遊戲對局,他們的 Arena Instance 也可以直接被刪除,
也就是說,Arena 現在不再是一個預先固定好的遊戲房間,而是更接近於根據玩家需求動態增減的 Instance。
MatchMaker 做了什麼?
大致將整個流程簡化之後,會變成:
玩家選擇地圖
│
MatchMaker()
│
├── 尋找相同地圖模板的 Arena
│
├── 找出「可加入狀態」且尚未滿人的 Arena
│
├── 優先選擇玩家數最多的 Arena
│
└── 沒有符合條件的 Arena ? 建立新的 Arena
│
加入玩家
為什麼會製作 MatchMaker?
其實之前在開發 Ranked Skywars 的時候就有解決過「Arena Queue」這個問題,不過那時候是用了其他作法(但時間有點久遠我忘記具體細節了)。這次用的方法算是更現代一點,而且用了更聰明一點的算法進行配對與動態增減,能夠不浪費太多記憶體或 I/O 消耗,也算是一個比較不錯且進步的方案,而且也適合作為槍戰伺服器的匹配方法。
同時,在開發這個方法的時候,也有考慮到未來的可研展性跟後續維護性。
在未來,我們會嘗試新增更多模式到 Search And Destroy 當中,豐富遊玩體驗性。
而因為 Search And Destroy 原本只是一個以「經典爆破」為主要的遊戲插件,因此很多現有的架構都是建立在「經典爆破」上的,若要新增更多模式,我們就需要將某些以「爆破模式」為主軸的一些核心架構部分進行重構,以達到多模式兼容。
這邊可以順便簡單提一下未來的開發計畫:
預計將於
ver.1.15.2支援 Minecraft Version1.21.11。
預計將在ver.1.16.0正式發布 Team Death Match(團隊死鬥) 模式
以上,就是這一次的 MatchMaker 開發日誌。


