跳轉到主要內容
本文概述如何在 XBOX 360 之後的平台上,使用 XBOX 服務多人遊戲工作階段目錄 (MPSD) 服務建立多人遊戲工作階段。 本文主要適用於直接將工作階段範本提交至 Partner Center 的 XBOX 遊戲開發人員。 本文涵蓋 MPSD 設定、使用方式以及多人遊戲工作階段的疑難排解。 內容:

修訂摘要

用戶端的 XBOX Services API (XSAPI) 程式庫目前在與 MPSD 服務通訊時使用合約版本 104。 此版本的文件將工作階段範本結構描述更新為合約版本 107,這是 MPSD 服務所支援的最新合約版本。 版本 104 與 107 之間的變更摘要於下方的合約結構描述更新一節中。 請注意,針對合約版本 104 撰寫的範本,如果要以 107 重新發佈,就需要更新。 不過,服務具有回溯相容性,因此您可以繼續使用目前的程式庫,這些程式庫將在未來的版本中更新。 本文件的上一個修訂版本更新了有關伺服器工作階段的資訊,並新增了有關 XSAPI 與 RESTful 服務呼叫的新章節。 此外,也更新了「查詢工作階段狀態資訊」一節中的表格,並修訂了「服務品質 (QoS) 範本」一節。

簡介

多人遊戲工作階段是一份位於雲端多人遊戲工作階段目錄 (MPSD) 上的安全文件,此文件代表一群正在玩遊戲的人。 具體而言,多人遊戲工作階段具有下列特性:
  • 每個工作階段都有唯一的 URI。
  • 工作階段文件包含目前的成員、遊戲設定、啟動程序資料以及遊戲伺服器資訊。
  • 遊戲會建立並管理自己的工作階段。
  • 工作階段可讓其成員之間建立連線。
多人遊戲工作階段目錄 (MPSD) 會集中管理所有用戶端的遊戲工作階段中繼資料。 MPSD 提供工作階段所需的基本資訊,以協助在用戶端之間設定安全裝置關聯。 MPSD 也提供基本的首次開機中繼資料,讓用戶端在開始傳遞更具體的遊戲資料之前連線至遊戲。 由於 XBOX One 及更新版本上應用程式的處理程序存留期管理 (PLM) 與工作切換特性,MPSD 可確保用戶端擁有正確的資訊,以聯絡被識別為作用中遊戲工作階段一部分的對等節點與伺服器,並與殼層和主機作業系統協調,以保留、啟用及管理遊戲工作階段中的玩家存留期。

本文件中使用的術語

多人遊戲工作階段目錄

MPSD 可促進並協助遊戲在線上玩家之間協調工作階段資訊。 可以建立不同類型的工作階段,以完成多人遊戲的不同工作。 下表列出在 XBOX 360 上與在 XBOX One 或更新版本 (包括 PC) 上完成這類工作的方式差異。

工作階段模式

  • 遊戲工作階段
    • 包含玩家的 XUID、安全裝置位址資料與屬性狀態的工作階段。這被視為實際的遊戲工作階段。
    • 可以是點對點、對等對主機、對等對伺服器或混合式。
  • 對戰票證工作階段
    • 提交至配對以尋找其他玩家一起遊玩的工作階段。請注意,如果遊戲正在尋找更多玩家,遊戲工作階段也可以是票證工作階段。
  • 伺服器工作階段
    • 透過 XBOX Compute 處理建立與使用的遊戲工作階段。
圖 1 說明 MPSD 工作階段的用法,其中藍色方塊代表 MPSD 工作階段,紅色方塊則是使用它們的服務。 圖 1. MPSD 工作階段用法: (缺少圖表)

MPSD 工作階段

工作階段會維護兩份相關實體的清單:
  1. 已加入或受邀加入工作階段的成員 (使用者)。
  2. 已加入工作階段的伺服器 (雲端伺服器或專用伺服器)。
每個實體都有:
  1. 在建立時設定的常數值。
  2. 可變的屬性。
  3. 唯讀的中繼資料。

XSAPI 與 RESTful 服務呼叫

與 XBOX 服務工作階段和配對服務互動的方式有兩種。
  • 標準 HTTPS 呼叫
  • XSAPI 包裝函式

使用標準 HTTPS 呼叫 RESTful 服務

對於 XBOX One 及更新版本,與 XBOX 服務工作階段和配對服務互動的第一種方式,是使用標準 HTTPS 呼叫 RESTful XBOX 服務 URI。 這讓遊戲能夠根據其伺服器與遊戲設定,彈性地呼叫這些服務並與其互動。 如需這些 URI 的清單,請參閱 XBOX 服務 RESTful 參考。

使用 RESTful 服務的 XSAPI 包裝函式

與工作階段和配對服務互動的第二種方式,是使用作為 RESTful 服務 URI 包裝函式的 XSAPI。 這讓您能以較傳統的方式在程式碼中使用 API,而不必為每個呼叫處理 HTTPS 流量。 如需 XSAPI 的詳細資訊,請參閱 xbox-live-api GitHub 頁面。 該參考文件包括:
  • JSON 剖析 API 參考 - JSON 剖析 API 的參考資料。
  • Windows.Web 命名空間 - Windows.Web 命名空間成員。
  • XBOX Compute SDK 參考 - 為 XBOX Compute 建立遊戲伺服器執行個體的 API。

MPSD 工作階段與範本

MPSD 工作階段是使用透過 Partner Center 擷取的範本來建立的。 範本是 JSON 文件,用於定義要建立之工作階段的架構。 範本會為新的工作階段提供常數。 下列摘錄是範本設定範例。
對戰票證工作階段應該搭配在其 memberInitialization 物件中設定了 QoS 逾時值的遊戲工作階段範本使用。 圖 2. 範例 hopper: Hopper 編輯對話方塊 下列程式碼摘錄是點對點遊戲工作階段範本 (遊戲管理的 QoS) 的範例。
這是對等對伺服器工作階段與 RAW 範本的範例。
下列程式碼顯示用於 Smart Match 的對戰票證工作階段範本範例。

檢查您的 SCID 設定了哪些範本

工作階段範本

可以從 MPSD 擷取 SCID 中存在的工作階段範本清單,以及特定工作階段範本的詳細資料:

查詢工作階段狀態資訊

可以在服務設定與工作階段範本層級查詢工作階段:
根據預設,這會傳回最多 100 個非私人工作階段。 可以使用下列查詢字串參數來修改查詢: 結果是工作階段參考的 JSON 陣列。 部分工作階段資料會內嵌包含在其中。 注意 每個查詢都必須包含關鍵字篩選、XUID 篩選,或兩者兼具。 將 private (傳回私人工作階段) 或 reservations (傳回使用者尚未加入的工作階段) 設為 true 時,呼叫者必須具有工作階段的伺服器層級存取權,或者呼叫者的 XUID 宣告必須符合 URI 中的 XUID 篩選。 否則,將會傳回 403 Forbidden (無論是否真的存在任何這類工作階段)。 下列程式碼摘錄顯示查詢回應的範例。

工作階段範本屬性

合約結構描述更新

如本文件開頭所述,最新的工作階段範本合約版本為 107,與先前的版本 104 相比,它對結構描述做了一些變更。 針對合約版本 104 撰寫的範本,如果要以 107 重新發佈,就需要更新。 以下是變更摘要。
  • /constants/system/managedInitialization 重新命名為 /constants/system/memberInitialization。
    • autoEvaluate 欄位重新命名為 externalEvaluation,且其極性相反,但預設值仍為 false。
    • membersNeededToStart 的預設值從 2 變更為 1。
    • joinTimeout 的預設值從 5 秒變更為 10 秒。
    • measurementTimeout 的預設值從 5 秒變更為 30 秒。
  • 移除了 /constants/system/timeouts,並將逾時重新命名並移至 /constants/system 下。
    • reserved 逾時變為 reservedRemovalTimeout。
    • inactive 逾時變為 inactiveRemovalTimeout,其新的預設值為 0,而非 2 小時。
    • ready 逾時變為 readyRemovalTimeout。
    • sessionEmpty 逾時變為 sessionEmptyTimeout。
  • 在代表實際遊戲 (相對於對戰與大廳工作階段等輔助工作階段) 的工作階段上,必須將 /constants/system/capabilities/gameplay 指定為 true,才能啟用最近一起玩的玩家與信譽回報。

系統物件

工作階段文件中的每個系統物件都有固定的結構描述,由 MPSD 強制執行並解譯。 在 PUT 要求的本文中,系統物件會像自訂物件一樣經過驗證與合併。 但與自訂物件不同的是,系統物件在合併後,會根據這些結構描述進一步驗證並據以執行動作。 /constants/system
/properties/system

逾時

工作階段可以由計時器與其他外部事件變更。 MPSD 中的 Timeouts 物件提供管理工作階段存留期與成員的基本機制。 工作階段的 nextTimer 欄位會提供下一個計時器的時間。 用戶端可以使用此資訊為下一次輪詢挑選合適的間隔。 此值也會在 Expires HTTP 標頭中傳回。 逾時以毫秒為單位指定。 允許使用零,表示逾時應立即發生。 如果未指定某個逾時,則會被視為無限。 由於逾時有預設值,工作階段範本應該明確為無限逾時指定「null」。

SessionEmptyTimeout

/constants/system/sessionEmptyTimeout 值會設定工作階段變成空的之後,經過多少毫秒會被刪除。 預設值為零,表示工作階段會立即被刪除。 如果未指定此值,空的工作階段將會無限期存在。

成員逾時

/constants/system 內的其他三個逾時,控制成員可以維持在特定狀態的時間長度:
  • reservedRemovalTimeout
    • 逾時到期時會刪除保留。預設值為 30 秒。
  • inactiveRemovalTimeout
    • 根據預設,非作用中成員會在兩小時後從工作階段中移除。
  • readyRemovalTimeout
    • 根據預設,處於「ready」狀態的成員會在三分鐘後還原為非作用中狀態。

工作階段文件中的成員初始化

成員初始化

memberInitialization 物件會控制工作階段建立後和/或新成員加入工作階段時的初始化階段。 工作階段會自動追蹤逾時與初始化階段,如果設定了任何計量,也包括 QoS 測量。 對於設定了 initializationEpisode 屬性的成員,這些逾時會覆寫工作階段的保留與就緒逾時。 範例:
圖 3. 成員初始化流程: 成員初始化流程圖 成員初始化的三個階段都可能逾時:
  1. joiningTimeout
    • 使用者加入工作階段的時間長度 (以毫秒為單位)。未能加入之成員的保留會被移除。
  2. measuringTimeout
    • 成員上傳其測量結果的時間長度。未能上傳測量結果的成員會被標記為 failureReason 為「timeout」。
  3. evaluationTimeout
    • 成員做出並上傳評估決策的時間長度。如果未收到任何決策,則視為失敗。
externalEvaluation
  • MPSD 可以根據工作階段範本中提供的需求,自動進行 QoS 評估。當 externalEvaluation 設為 false 時,就會執行評估。設定 evaluationTimeout 時,externalEvaluation 必須為 true。如果有兩個點對點或對等對主機需求,您仍應將 externalEvaluation 設為 false,讓工作階段自動完成初始化。
membersNeededToStart
  • 這是自動評估成功所需、必須存在 “initialize”:“true” 並通過 QoS 的成員保留數目下限。

初始化回合

設定 memberInitialization 物件時,MPSD 會依回合推進初始化階段。 第一個回合會在建立工作階段時開始,並包含範本中定義的所有階段。 在回合執行期間受邀或加入的任何新成員,都會被標記為參與下一個回合。 一般而言,可以從工作階段的 initializing 物件擷取回合或 memberInitialization 的狀態。 注意 請注意,初始化完成後會移除此物件。 範例:
階段會從 joining 進入 measuring,再進入 evaluating。 如果某個回合失敗,stage 會被設為 failed,且工作階段無法初始化。 否則,當初始化回合完成時,就會移除 initializing 物件。 也可以追蹤每個成員的初始化失敗。 如果此成員未通過,就會在離開 joining 或 measuring 階段時設定這些失敗。 範例:
依優先順序,此屬性的值可以設為 timeout、latency、bandwidthdown、bandwidthup、network、group 或 episode。 network 值表示網路設定和/或狀況 (例如衝突的網路位址轉譯 [NAT]) 導致無法測量 QoS 計量。 joining 結束時唯一可能的值是 group。 (joining 逾時時,會移除保留。) 如果設定了 memberInitialization,且成員是以 “initialize”: true 新增的,此值會設為該成員將參與的初始化回合。建立新工作階段時新增至工作階段的成員會使用值 1,且此值會在初始化回合結束時移除。

對戰票證工作階段

當 MPSD 工作階段被用作對戰票證工作階段時,會使用一些特殊的工作階段屬性與常數。 /members//constants/system
當配對服務將使用者新增至工作階段時,會在 matchmakingResult 欄位中提供一些關於使用者如何以及為何被配對至該工作階段的內容。
這是使用者在配對工作階段中的 serverMeasurements 複本。

服務品質 (QoS) 範本

對於遊戲工作階段範本,可以新增一些值,告知 MPSD 與網路層以及主機社交功能協調。 此協調的目的是在建立工作階段之前,以及在通知使用者遊戲已可加入之前,驗證連線狀態的品質。 下列程式碼摘錄是具有 QoS 的對等對主機遊戲工作階段範本範例:
此程式碼摘錄是具有 QoS 的點對點遊戲工作階段範本範例:

QoS 工作階段範本屬性

如果設定了 memberInitialization 物件,工作階段會預期用戶端系統或遊戲在工作階段建立後和/或新成員加入工作階段時執行初始化。 工作階段會自動追蹤逾時與初始化階段,如果設定了任何計量,也包括 QoS 測量。 對於設定了 initializationEpisode 屬性的成員,這些逾時會覆寫工作階段的保留與就緒逾時。
具有 QoS 的遊戲工作階段需要 connectivity 功能。 如果未指定計量,預設會使用滿足 QoS 需求所需的計量。 如果有指定計量,則必須足以滿足 QoS 需求。
下列閾值適用於工作階段中所有成員之間的每個成對連線:
下列閾值適用於來自主機候選項目的每個連線:
應該評估下列可能的伺服器連接字串 (請注意,連接字串必須為小寫):
members//properties/system 這些旗標控制成員狀態與 activeTitle,且彼此互斥 (將兩者都設為 true 是錯誤的)。 對每個旗標而言,false 與「不存在」相同。預設狀態為「inactive」,也就是兩者都不存在。

QoS 階段與工作階段初始化詳細資料

範本完成成員初始化後,MPSD 會追蹤並回報遊戲建立的 QoS 結果。 此作業的進度會以工作階段文件中的 initializing 物件表示,如上方的成員初始化一節所述。 initializing 物件具有 stage 屬性,代表目前的初始化階段。 階段會從 joining 進入 measuring,再進入 evaluating。
  • 如果初始化回合 #1 失敗,stage 會被設為 failed,且工作階段無法初始化。否則,當初始化回合完成時,就會移除「initializing」物件。如果 externalEvaluation 設為 false,就會略過 evaluating 階段。如果 metrics 與 measurementServerAddresses 都未設定,就會略過 measuring 階段。
  • 主機候選項目是依偏好順序列出的裝置權杖。如果設定了 peerToHostRequirements 且未設定 /properties/system/host,則會在初始化回合 #1 的 measuring 階段之後設定這些項目。設定 /properties/system/host 物件後,就會清除這些項目。
  • 只有在成員已接受,且找到該成員的玩家代號宣告時,才會設定 gamertag 屬性。
  • deviceToken 屬性會在成員上傳安全裝置位址時設定。它是不區分大小寫的字串,可用於相等比較。
  • 使用者對工作階段文件執行第一個 PUT 要求後,就會移除 reserved 值。玩家處於保留狀態,表示他們已受邀加入遊戲工作階段,但既未接受,其連線也尚未經過評估。
  • 如果成員處於作用中狀態,activeTitleId 就是成員作用中之遊戲的十進位識別碼。
  • 此屬性是指使用者加入工作階段的時間。如果 reserved 為 true,則 joinTime 會是建立保留的時間。
  • 如果此成員在 properties/system/turn 陣列中,就會存在此屬性,否則不會存在。
  • 如果成員未成功通過 joining 或 measuring 階段,則會在離開該階段時於成員物件上設定 initializationFailure 屬性。依優先順序,它可以設為 timeout、latency、bandwidthdown、bandwidthup、network、group 或 episode。 network 值表示網路設定和/或狀況 (例如衝突的網路位址轉譯 [NAT]) 導致無法測量 QoS 計量。joining 結束時唯一可能的值是 group。(joining 逾時時,會移除保留。) 在「evaluation」階段失敗後,會對初始化回合中所有未在 joining 或 measuring 期間失敗的成員設定 episode 值。
  • 如果設定了 memberInitialization,且成員是以 “initialize”: true 新增的,此值會設為該成員將參與的初始化回合。建立新工作階段時新增的成員會使用值 1。初始化回合結束時會移除此值。
  • next 屬性代表工作階段中下一個成員的索引值。如果沒有更多成員要新增,其值會與下方 membersInfo 物件中的 next 屬性相同。

XBOX Cloud Compute 工作階段 (已淘汰)

XBOX Cloud Compute 工作階段包含不區分大小寫之連接字串的排序清單,工作階段可以使用這些字串連線至遊戲伺服器。 一般而言,遊戲應該使用清單上的第一個字串,但較複雜的遊戲可以使用自訂機制來選擇其他字串之一 (例如根據負載)。
**/servers//properties/system **

原始工作階段與自訂遊戲屬性

工作階段可用來儲存與多人遊戲相關的自訂管理資訊 (中繼資料)。 遊戲資料或儲存的資訊應該儲存在 TMS++ 中。

屬性包

上述標示為屬性包的每個物件,都由兩個選擇性的內部物件 system 與 custom 組成。 custom 物件可以包含任何 JSON。

作用中成員衰減

當 MPSD 偵測到使用者不再參與遊戲時,作用中成員會自動被標記為非作用中。 例如,如果目前狀態服務讓使用者記錄逾時,就可能發生這種情況。 此機制只是最後一道防線;也就是說,當成員離開或切換離開遊戲、登出或以其他方式不再參與時,遊戲仍必須主動將成員標記為非作用中 (或將其從工作階段中移除)。

常見問題集與疑難排解

如何呼叫 MPSD?

使用憑證驗證:client-sessiondirectory.xboxlive.com 範例:
使用 XToken 驗證:sessiondirectory.xboxlive.com 範例:

如何找出要使用的 SCID、工作階段範本與沙箱?

您可以在 Partner Center 中您遊戲的頁面找到此資訊。 如果您尚未取得 Partner Center 的存取權,請聯絡您的開發人員客戶經理,他們可以協助您取得此資訊。

是否有可供我比較的要求本文範例?

呼叫 MPSD 時收到 404 錯誤。

收集 Fiddler 追蹤以協助取得更多資訊,然後執行下列步驟:
  1. 檢查作為 HttpResponse 本文一部分傳回的訊息中是否有常見的 404 訊息:
    • The requested service config is either invalid or not configured for sessions。請確認使用的 SCID 正確無誤。
    • The requested session wasn’t found。擷取工作階段之前,請確認已建立工作階段,且工作階段範本正確無誤。您可以使用 PUT 呼叫建立工作階段。
  2. 檢查您使用的 URI。
  3. 重新開機主機和/或使用新的使用者再試一次。

呼叫 MPSD 時收到 403 錯誤。

這通常是權限或範圍問題。 收集 Fiddler 追蹤以協助取得更多資訊,然後執行下列步驟:
  1. 檢查作為 HttpResponse 本文一部分傳回的訊息中是否有常見的 403 訊息:
  • *The requested service config cannot be accessed. *
    • 請確認您使用的帳戶具有該沙箱的存取權。
    • 請確認您位於正確的沙箱中。
    • 如果您使用憑證驗證並收到此錯誤,請聯絡您的 DAM。
  • The requested session cannot be accessed. Private Sessions can only be read by members of the session.
    • 您正嘗試存取可見度為「private」的工作階段。只有工作階段內的成員才能讀取工作階段文件。
  • The request body can’t contain existing member references unless the authentication principal includes a server.
    • 您無法代表使用者將其他使用者加入工作階段,只能邀請。請將索引設為 “reserve_<number>” 以邀請玩家。

收到 412 Precondition Failed 錯誤。

如果工作階段已經存在,這會傳回 412 Precondition Failed:
如果工作階段 etag 與 If-Match 標頭不相符,這會傳回 412 Precondition Failed:

呼叫 MPSD 時收到 405、409、503 與 400 等錯誤。

收集 Fiddler 追蹤以協助取得更多資訊,然後檢查作為 HttpResponse 本文一部分傳回的訊息。 如果您使用 XSAPI,也可以將 HCSettingsSetTraceLevel 屬性設為 HCTraceLevel::Information 來取得回應本文;如果設定了 HCTraceSetTraceToDebugger,就會在偵錯輸出中輸出此資訊,或者您可以使用 HCTraceSetClientCallback 取得回呼,並在其中將追蹤記錄新增至遊戲自己的追蹤記錄。您也可以使用 XblAddServiceCallRoutedHandler,在每次服務呼叫時收到呼叫,並將其路由至您自己的記錄。

我可以或應該在遊戲的範本中變更哪些內容?

工作階段範本並非預設值,而更像是模具。 不過,您無法覆寫範本中已設定的常數,但可以新增常數。

我收到錯誤,指出我的工作階段尚未初始化。

當您的範本中有成員初始化時 (通常是遊戲、派對與對戰票證情境),您需要確定有足夠的成員保留 (開始所需的成員數) 設定了 “initialize=true” 並通過 QoS,才能修正此問題。

我的工作階段沒有建立,而且收到 HTTP 204 錯誤。

這表示您在建立工作階段時沒有新增任何使用者。 如果工作階段在建立時沒有任何使用者,就不會建立該工作階段。 請確定在建立工作階段時至少新增一位玩家。 對於專用伺服器情境,請取得一位正在嘗試建立對戰或需要建立對戰的玩家,並讓該使用者成為該對戰中的初始玩家。 或者,您可以變更或移除 sessionEmptyTimeout。

何時應該輪詢 MPSD?

您應該避免輪詢 MPSD 工作階段。 概括來說,您可以將程式碼設計為只在為每個用戶端初次建立網路連線,以及為已失去連線的用戶端重新建立網路狀態時,才使用 MPSD 工作階段。 善用 MPSD 以 etag 為基礎的同步處理基本類型也很重要,如此便不需要重新整理工作階段狀態來解決競爭條件。 這些原則的常見應用情況,是當您有一組 N 個用戶端都需要彼此連線並在點對點網格中遊玩時。 每個成員可以加入工作階段、連線至工作階段中已有的成員,並假設之後加入的任何成員都會執行相同的動作,而不是定期查詢工作階段中是否有新成員。 如需如何實作此作法的範例,請參閱 Chat 與 Player Rendezvous 範例。 在極少數情況下,可能需要短時間輪詢;如果您認為需要這麼做,請聯絡您的開發人員客戶經理。
最後修改於 2026年10月8日