

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 回填現有遊戲 FlexMatch
<a name="match-backfill"></a>

配對回填會使用 FlexMatch 機制，針對現有已配對的遊戲工作階段尋找新玩家。雖然您可以隨時將玩家新增至任何遊戲 （請參閱[加入玩家到遊戲工作階段），](https://docs.aws.amazon.com/gamelift/latest/developerguide/gamelift-sdk-client-api.html#gamelift-sdk-client-api-join)但配對回填可確保新玩家符合與目前玩家相同的配對條件。此外，配對回填會將新玩家指定到團隊、管理玩家接受和將更新配對資訊傳送到遊戲伺服器。進一步了解配對回填：[FlexMatch 配對程序](gamelift-match-howitworks.md)。

**注意**  
FlexMatch 回填目前不適用於使用 的遊戲Amazon GameLift Servers Realtime。

回填機制有兩種類型：
+ 啟用自動回填以填滿開頭小於允許玩家上限的遊戲工作階段。自動回填不會回填加入遊戲然後退出的玩家。
+ 設定手動回填機制，以取代正在退出遊戲工作階段的玩家。此機制必須能夠偵測開啟的插槽，並產生回填請求來填滿它。

# 開啟自動回填
<a name="match-backfill-auto"></a>

使用自動配對回填功能，只要遊戲工作階段以一或多個未填滿的玩家位置開始，Amazon GameLift Servers 便會自動觸發回填請求。此功能可讓遊戲在找到最低匹配玩家人數後立即開始，並在配對到其他玩家時填滿剩餘的位置。您可以隨時選擇停止自動回填。

例如，假設遊戲可以容納 6 到 10 名玩家。 FlexMatch一開始會找到 6 名玩家，組成配對，並啟動新的遊戲工作階段。使用自動回填功能，新的遊戲工作階段可以立即請求額外的四名玩家。根據遊戲風格，我們可能想要允許新玩家在遊戲工作階段期間隨時加入。或者，我們可能想要在初始設定階段和遊戲開始之前停止自動回填。

若要將自動回填新增到您的遊戲，請對遊戲進行下列更新。

1. **啟用自動回填。**自動回填是由配對組態加以管理。啟用時，自動回填會與該配對建置器建立的所有配對遊戲工作階段搭配使用。只要遊戲工作階段在遊戲伺服器上啟動，Amazon GameLift Servers 便會開始針對非完整遊戲工作階段產生回填請求。

   若要開啟自動回填，開放配對組態並將回填模式為「自動」(AUTOMATIC)。如需詳細資訊，請參閱 [建立配對組態](match-create-configuration.md)。

1. **開啟回填優先順序**。自訂您的配對程序，在建立新的配對之前，先排定填補回填請求的優先順序。在您的配對規則集中，新增演算法元件並將回填優先順序設定為「高」。如需詳細資訊，請參閱[自訂比對演算法](match-rulesets-components-algorithm.md)。

1. **使用新的配對建構器資料更新遊戲工作階段。** 會使用伺服器開發套件回呼函數，以配對資訊Amazon GameLift Servers更新您的遊戲伺服器 `onUpdateGameSession`（請參閱[初始化伺服器程序](https://docs.aws.amazon.com/gamelift/latest/developerguide/gamelift-sdk-server-api.html#gamelift-sdk-server-initialize))。將程式碼新增到您的遊戲伺服器，以便在回填活動後處理更新的遊戲工作階段物件。請至 [更新遊戲伺服器上的配對資料](match-backfill-server-data.md) 進一步了解。

1. **關閉遊戲工作階段的自動回填。**在個別遊戲工作階段期間，您可以隨時停止自動回填。若要停止自動回填，將程式碼新增到您的遊戲用戶端或遊戲伺服器，讓 Amazon GameLift Servers API 呼叫 [StopMatchmaking](https://docs.aws.amazon.com/gamelift/latest/apireference/API_StopMatchmaking.html)。此呼叫需要票證 ID。從最新的回填請求使用回填票證 ID。您可以從遊戲工作階段配對資料取得此資訊，更新內容如之前步驟所述。

# 從遊戲伺服器產生手動回填請求
<a name="match-backfill-server"></a>

您可以從託管遊戲工作階段的遊戲伺服器程序手動啟動配對回填請求。伺服器程序具有連接至遊戲之玩家up-to-date，以及空玩家位置的狀態。

本主題假設您已成功建置必要的 FlexMatch 元件並成功將配對建構程序新增至遊戲伺服器和用戶端遊戲服務。如需設定 FlexMatch 的詳細資訊，請參閱 [路線圖：將配對新增至Amazon GameLift Servers託管解決方案](match-tasks.md)。

若要為遊戲啟用配對回填，新增以下功能：
+ 請將配對建構回填請求傳送到配對建構器來追蹤請求的狀態。
+ 更新遊戲工作階段的配對資訊。請參閱 [更新遊戲伺服器上的配對資料](match-backfill-server-data.md)。

如同其他伺服器功能，遊戲伺服器會使用 Amazon GameLift Servers 伺服器開發套件。您可以 C\$1\$1 及 C \$1 使用此開發套件。

為了從遊戲伺服器進行配對回填，請完成以下任務。

1. **觸發配對回填請求。**一般而言，當配對的遊戲有一或多個玩家空位時，建議您初始化回填請求。建議您將回填請求連繫至特定的情況 (例如填入關鍵字元角色或平衡團隊)。您可能還想要根據遊戲工作階段的存留期動限制回填活動。

1. **建立回填請求。**您能夠新增程式碼以建立配對回填請求，並將其傳送至 FlexMatch 配對建構器。使用這些伺服器 API 處理回填請求：
   + [ StartMatchBackfill()](https://docs.aws.amazon.com/gamelift/latest/developerguide/integration-server-sdk-cpp-ref-actions.html#integration-server-sdk-cpp-ref-startmatchbackfill)
   + [ StopMatchBackfill()](https://docs.aws.amazon.com/gamelift/latest/developerguide/integration-server-sdk-cpp-ref-actions.html#integration-server-sdk-cpp-ref-stopmatchbackfill)

   若要建立回填請求，請以下列資訊呼叫 `StartMatchBackfill`。若要取消回填請求，請使用回填請求票證 ID 來呼叫 `StopMatchBackfill`。
   + **票證 ID** — 提供配對票證 ID （或選擇讓它們自動產生）。您可以使用相同的機制，將票證 ID 指派到配對建構和回填請求。會以相同的方式處理配對建構和回填的票證。
   + **配對建構**器 — 識別要用於回填請求的配對建構器。一般而言，您將想要使用用於建立原始配對的相同配對建構器。此請求需要配對建構組態 ARN。這項資訊會存放在遊戲工作階段物件 ([GameSession](https://docs.aws.amazon.com/gamelift/latest/apireference/API_GameSession.html)) 中，啟用遊戲工作階段時，Amazon GameLift Servers 即會將該物件提供給伺服器程序。配對建構組態 ARN 包含在 `MatchmakerData` 屬性中。
   + **遊戲工作階段 ARN** — 識別要回填的遊戲工作階段。您可以呼叫伺服器 API [ GetGameSessionId()](https://docs.aws.amazon.com/gamelift/latest/developerguide/integration-server-sdk-cpp-ref-actions.html#integration-server-sdk-cpp-ref-getgamesessionid) 來取得遊戲工作階段 ARN。在配對建構程序期間，新請求的票證不會有遊戲工作階段 ID，而回填請求的票證會有。在遊戲工作階段 ID 的存在可讓您了解新配對的票證和回填票證的差異。
   + **玩家資料** — 在您回填的遊戲工作階段中包含所有目前玩家的玩家資訊 ([Player](https://docs.aws.amazon.com/gamelift/latest/apireference/API_Player.html))。此資訊可讓配對建構器為目前在遊戲工作階段中的玩家找到最可能的玩家配對。您必須包含每個玩家的團隊成員資格。如果您未使用回填，請勿指定團隊。如果您的遊戲伺服器已準確報告玩家連線狀態，您應該要能取得此資料，如下所示：

     1. 代管遊戲工作階段的伺服器程序應擁有哪些玩家正連接到遊戲工作階段的最新資訊。

     1. 若要取得玩家 IDs、屬性和團隊指派，請從遊戲工作階段物件 ([GameSession](https://docs.aws.amazon.com/gamelift/latest/apireference/API_GameSession.html))、`MatchmakerData`屬性 （請參閱 ) 提取玩家資料[關於配對建構器資料](match-server.md#match-server-data)。配對建構器資料包含配對至遊戲工作階段的所有玩家，您只需要為目前連線的玩家提取玩家資料。

     1. 對於玩家延遲，如果配對建構器呼叫延遲資料，從所有目前玩家收集新延遲值，並將其包含在每個 `Player` 物件。如果將延遲資料省略和配對建構器有延遲規則，則請求無法成功相配。回填請求只需要遊戲工作階段目前所在之區域的延遲資料。您可以從 `GameSession` 物件的 `GameSessionId` 屬性取得遊戲工作階段區域，此值是包含在該區域的 ARN。

1. **追蹤回填請求的狀態。 **會使用伺服器開發套件回呼函數Amazon GameLift Servers，更新您的遊戲伺服器關於回填請求的狀態 `onUpdateGameSession`（請參閱[初始化伺服器程序](https://docs.aws.amazon.com/gamelift/latest/developerguide/gamelift-sdk-server-api.html#gamelift-sdk-server-initialize))。在 新增程式碼以處理狀態訊息，以及由於成功回填請求而更新的遊戲工作階段物件[更新遊戲伺服器上的配對資料](match-backfill-server-data.md)。

   配對建構器可隨時處理來自遊戲工作階段的配對回填請求。如果您需要取消請求，請呼叫 [ StopMatchBackfill()](https://docs.aws.amazon.com/gamelift/latest/developerguide/integration-server-sdk-cpp-ref-actions.html#integration-server-sdk-cpp-ref-stopmatchbackfill)。如果您需要變更請求，請呼叫 `StopMatchBackfill` 接著提交更新請求。

# 從後端服務產生手動回填請求
<a name="match-backfill-client"></a>

除了從遊戲伺服器傳送回填請求，您可能要從用戶端遊戲服務來傳送他們。若要使用此選項，用戶端服務必須能夠存取遊戲工作階段活動和玩家連線上的目前資料；如果您的遊戲使用工作階段目錄服務，這可能會是最佳選擇。

本主題假設您已成功建置必要的 FlexMatch 元件並成功將配對建構程序新增至遊戲伺服器和用戶端遊戲服務。如需設定 FlexMatch 的詳細資訊，請參閱 [路線圖：將配對新增至Amazon GameLift Servers託管解決方案](match-tasks.md)。

若要為遊戲啟用配對回填，新增以下功能：
+ 請將配對建構回填請求傳送到配對建構器來追蹤請求的狀態。
+ 更新遊戲工作階段的配對資訊。請參閱 [更新遊戲伺服器上的配對資料](match-backfill-server-data.md)

如同其他用戶端功能，用戶端遊戲服務會使用 AWS SDK 搭配 Amazon GameLift Servers API。SDK 有 C\$1\$1、C\$1 及多種其他語言的選擇。如需用戶端 APIs 的一般說明，請參閱 Amazon GameLift Servers API 參考，其中說明 Amazon GameLift Servers動作的服務 API 和語言特定參考指南的連結。

若要設定用戶端遊戲服務，以回填配對遊戲，請完成以下任務。

1. **觸發回填請求。**一般而言，當配對的遊戲有一或多個玩家空位時，遊戲會初始化回填請求。建議您將回填請求連繫至特定的情況 (例如填入關鍵字元角色或平衡團隊)。您可能還想要根據遊戲工作階段的存留期動限制回填。無論您用於觸發的條件為何，至少您會需要下列資訊。您可以透過呼叫含遊戲工作階段 ID 的 [DescribeGameSessions](https://docs.aws.amazon.com/gamelift/latest/apireference/API_GameSession.html) 來從遊戲工作階段物件 ([GameSession](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribeMatchmaking.html)) 取得此資訊。
   + *目前玩家空位數*。您可以從遊戲工作階段玩家上限和目前玩家數目來計算此值。每當遊戲伺服器聯絡 Amazon GameLift Servers 服務來驗證新玩家連線或報告捨棄的玩家時，即會更新目前玩家數目。
   + *建立政策*。此設定表示遊戲工作階段目前是否接受新玩家。

    遊戲工作階段物件包含其他可能有用的資訊 (包括遊戲工作階段開始時間、自訂遊戲屬性和配對建構器資料)。

1. **建立回填請求。**您能夠新增程式碼以建立配對回填請求，並將其傳送至 FlexMatch 配對建構器。使用這些用戶端 API 處理回填請求：
   + [StartMatchBackfill](https://docs.aws.amazon.com/gamelift/latest/apireference/API_StartMatchBackfill.html)
   + [StopMatchmaking](https://docs.aws.amazon.com/gamelift/latest/apireference/API_StopMatchmaking.html)

   若要建立回填請求，請以下列資訊呼叫 `StartMatchBackfill`。回填請求類似於配對建構請求 (請參閱 [為玩家請求配對](match-client-start.md))，但其能識別現有的遊戲工作階段。若要取消回填請求，請使用回填請求票證 ID 來呼叫 `StopMatchmaking`。
   + **票證 ID** — 提供配對票證 ID （或選擇讓它們自動產生）。您可以使用相同的機制，將票證 ID 指派到配對建構和回填請求。會以相同的方式處理配對建構和回填的票證。
   + **配對建構器** — 識別要使用的配對組態名稱。一般而言，您將想要使用用於建立原始配對之回填的相同配對建構器。此資訊會在配對建構組態 ARN 下的遊戲工作階段物件 ([GameSession](https://docs.aws.amazon.com/gamelift/latest/apireference/API_GameSession.html))、`MatchmakerData` 屬性中。名稱值是接在「matchmakingconfiguration/」之後的字串。(例如，在 ARN 值「arn:aws:gamelift:us-west-2:111122223333:matchmakingconfiguration/MM-4v4」，配對建構組態名稱為「MM-4v4」。) 
   + **遊戲工作階段 ARN** — 指定要回填的遊戲工作階段。從遊戲工作階段物件使用 `GameSessionId` 屬性，此 ID 會使用您需要的 ARN 值。回填請求的配對建構票證 ([MatchmakingTicket](https://docs.aws.amazon.com/gamelift/latest/apireference/API_MatchmakingTicket.html)) 在處理時擁有遊戲工作階段 ID；新配對建構請求的票證不會取得新遊戲工作階段 ID，直到進行配對為止；遊戲工作階段 ID 的存在可讓您了解新配對票證和回填票證之間的差異。
   + **玩家資料** — 在您回填的遊戲工作階段中包含所有目前玩家的玩家資訊 ([Player](https://docs.aws.amazon.com/gamelift/latest/apireference/API_Player.html))。此資訊可讓配對建構器為目前在遊戲工作階段中的玩家找到最可能的玩家配對。您必須包含每個玩家的團隊成員資格。如果您未使用回填，請勿指定團隊。如果您的遊戲伺服器已準確報告玩家連線狀態，您應該要能取得此資料，如下所示：

     1. 呼叫含遊戲工作階段 ID 的 [DescribePlayerSessions()](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribePlayerSessions.html) 來探索目前正在連接到遊戲工作階段的所有玩家。每個玩家工作階段皆包含玩家 ID。您可以新增狀態篩選以只擷取作用中玩家工作階段。

     1. 從遊戲工作階段物件 ([GameSession](https://docs.aws.amazon.com/gamelift/latest/apireference/API_GameSession.html))、`MatchmakerData` 屬性 (請參閱 [關於配對建構器資料](match-server.md#match-server-data)) 提取玩家資料。使用在之前步驟中取得的玩家 ID，以僅取得目前連線玩家的資料。由於在玩家中途退出時資料建構器資料不會更新，您只需要為目前的玩家擷取資料。

     1. 對於玩家延遲，如果配對建構器呼叫延遲資料，從所有目前玩家收集新延遲值，並將其包含在 `Player` 物件。如果將延遲資料省略和配對建構器有延遲規則，則請求無法成功相配。回填請求只需要遊戲工作階段目前所在之區域的延遲資料。您可以從 `GameSession` 物件的 `GameSessionId` 屬性取得遊戲工作階段區域，此值是包含在該區域的 ARN。

1. **追蹤回填請求的狀態。**新增程式碼以監聽配對建構票證狀態更新。您可以使用事件通知 (偏好) 或輪詢，透過機制設定來追蹤新配對建構請求的票證 (請參閱 [追蹤配對事件](match-client-track.md))。雖然您不需要觸發玩家接受活動與回填請求，玩家資訊即會在遊戲伺服器上進行更新，您仍需要監控票證狀態來處理請求失敗和重新提交。

   配對建構器可隨時處理來自遊戲工作階段的配對回填請求。如果您需要取消請求，請呼叫 [StopMatchmaking](https://docs.aws.amazon.com/gamelift/latest/apireference/API_StopMatchmaking.html)。如果您需要變更請求，請呼叫 `StopMatchmaking` 接著提交更新請求。

   一旦配對回填請求成功，您的遊戲伺服器會收到更新的 `GameSession` 物件並處理所需的任務以將新玩家加入遊戲工作階段。請參閱 [更新遊戲伺服器上的配對資料](match-backfill-server-data.md) 了解更多資訊。

# 更新遊戲伺服器上的配對資料
<a name="match-backfill-server-data"></a>

無論您在遊戲中初始化配對回填請求的方式為何，遊戲伺服器必須能夠處理因配對回填請求，Amazon GameLift Servers 所提供的遊戲工作階段更新。

當 Amazon GameLift Servers完成配對回填請求，無論是否成功，都會使用回呼函數 來呼叫您的遊戲伺服器`onUpdateGameSession`。此呼叫有三個輸入參數：配對回填票證 ID、狀態訊息，以及包含最新配對資料的 GameSession 物件 (包括玩家資訊)。您需要在遊戲伺服器整合過程中將以下程式碼新增到遊戲伺服器：

1. 實作 `onUpdateGameSession` 函式。此函式必須能夠處理以下狀態訊息 (`updateReason`)：
   + MATCHMAKING\$1DATA\$1UPDATED – 新玩家已成功符合遊戲工作階段。`GameSession` 物件包含更新的配對建構資料 (包含有關現有玩家和新配對玩家的玩家資料)。
   + BACKFILL\$1FAILED – 由於內部錯誤，配對回填嘗試失敗。`GameSession` 物件保持不變。
   + BACKFILL\$1TIMED\$1OUT – 配對建構器無法在時間限制內找到回填配對。`GameSession` 物件保持不變。
   + BACKFILL\$1CANCELLED – 對 StopMatchmaking （用戶端） 或 StopMatchBackfill （伺服器） 的呼叫取消配對回填請求。`GameSession` 物件保持不變。

1. 對於成功回填配對，使用更新的配對建構器資料以在新玩家連接到遊戲工作階段時能處理他們。您至少需要為新玩家使用團隊指派，以及其他所需的玩家屬性讓玩家在遊戲中得以開始。

1. 在遊戲伺服器對伺服器 SDK 動作 [ ProcessReady()](https://docs.aws.amazon.com/gamelift/latest/developerguide/integration-server-sdk-cpp-ref-actions.html#integration-server-sdk-cpp-ref-processready) 的呼叫中，新增回`onUpdateGameSession`呼方法名稱做為程序參數。