跳轉到主要內容

PlayFab 用量:最佳做法

使用 PlayFab 以用量為基礎的定價模型,您只需為遊戲的實際服務用量付費。但這引發了一個顯而易見的問題:如何以最佳方式最佳化這些遊戲以節省成本,同時仍實作您需要的所有功能?在本文件中,我們將深入探討這些細節,並說明有助於您提前規劃的最佳做法。 在將遊戲從開發模式移至上線之前,您可以在 Game Manager 的 Billing Summary 索引標籤中檢閱計量資訊。 有六種用量計量:事件、設定檔、內容和設定、CloudScript、Insights 以及多人遊戲服務。開始最佳化遊戲的最佳方式,是查看它使用的每個計量,並了解它如何隨時間累積。這可讓您快速找出一些明顯的改善之處。如需計量的詳細資訊,請參閱定價計量。

事件

PlayFab 中有兩種類型的事件:PlayStream 和遙測。 PlayFab 會處理 PlayStream 事件,以檢查它們是否觸發您所定義的 PlayStream 動作,並更新使用者區段。某些 PlayStream 事件會因呼叫驗證和統計資料更新等服務功能而自動產生。遊戲可以產生自己的自訂事件來擴充此功能。 遙測事件不會由 PlayStream 處理。這些事件用於分析,並直接進入資料倉儲。遙測事件不會在 PlayFab 中自動產生;它們是由遊戲產生的自訂事件。 對於這兩種事件類型,較大的資料承載都會增加計量用量的總量。您可以確保只傳送所需的資料,以降低整體用量。粗略的準則是,任何指定事件在事件本文中每 1 KB 資料都會讓相關計量遞增 1。 若要選擇最適合您用法的事件路徑,您應該對如何使用所產生的每個自訂事件有明確的計畫。只有遊戲離線評估才需要的事件應走遙測路徑。這有助於大幅降低成本,因為遙測事件的超額費用不到 PlayStream 的一半。 如果您使用的是預先建置的 SDK,請務必記住,某些關於使用者行為的分析資料會自動產生,如 PlayStream 事件模型參考中所述。若要關閉選用事件,請在 PlayFab Game Manager 中變更遊戲的 Settings/Data Collection 索引標籤中的分析設定。同樣地,雖然在偵錯期間為 CloudScript 執行開啟「產生 PlayStream 事件」選項是個好主意,但您應確保在上線之前將其停用。對於 PlayStream 動作觸發的 CloudScript,如果您需要在實際環境中偵錯某些行為,隨時可以稍後再開啟它們。

設定檔

設定檔實際上是「關於玩家的一切」,包括物品欄、儲存的資料和統計資料等常見元素。它也包含您用來透過 PlayStream 中的 LiveOps 功能驅動獨特體驗的中繼資訊,例如上述的使用者區段。此外,某些遊戲層級的舊版功能 (例如遊戲資料、目錄和商店) 也包含在此計量中,因為它們的資料實作實際上與使用者資料相同。由於這組計量是由所有玩家動作以及對玩家採取的動作所驅動,因此它是最需要最佳化規劃的計量。 定價計量所擷取之用量的主要影響因素,是讀取、儲存和寫入的資料量,以及您呼叫產生計量資料之 API 的頻率。 如需導致這些計量「轉動」之特定 API 呼叫的詳細資訊,請參閱定價計量。 我們將從使用者資料和統計資料開始,因為它們的使用模式相似,然後我們將討論玩家物品欄管理。

資料和統計資料

評估使用者資料的用量時,適用與事件相同的近似邏輯——每 1 KB 讓計量計數增加 1——不過請記住,基於此計算的目的,呼叫的每個「元素」都應視為不同的。更新使用者資料之呼叫中的每個索引鍵值組都會分別計算。對於讀取,此 1 KB 計算適用於傳回的總資料,無論索引鍵值組的數目為何。這表示寫入 10 個各 100 位元組的索引鍵是設定檔寫入計量的 10 個「刻度」,因為每個索引鍵值組寫入最少為 1 KB,而讀取這 10 個索引鍵則是 1 個「刻度」,因為總共是 1 KB。如需用量的更具體詳細資料,請參閱定價計量。 統計資料稍微複雜一些,因為它們會更新設定檔,也可能對排行榜產生影響。一般而言,您可以將每個更新的統計資料視為完整的設定檔更新,而讀取則以每次呼叫中讀取之資料的總大小為基礎。由於儲存體是以每 GB 計價,而統計資料通常每個只會耗用幾個位元組,因此我們將專注於讀取和寫入。 由於總資料大小很重要,因此最佳化它是第一步。幸運的是,有各種廣為人知的技術可以達成這一點——使用列舉或識別碼取代物品的完整文字、將大型資料封裝為二進位,甚至使用位元欄位將資料封裝到較小的空間中。完成後,下一步是仔細評估何時需要進行這些讀取和寫入呼叫。 如果您來自 PC 或主機開發——特別是單人遊戲——這可能是一種新模式。但在這些環境中,您必須小心用戶端裝置上的資源衝擊和記憶體回收,因為它們可能會在關鍵時刻造成效能降低。當您的遊戲使用雲端中的資源時,除了效能成本之外,還必須將此邏輯延伸,將每次資源衝擊都視為具有實際成本。 您如何判斷讀取和寫入的最佳頻率?想要更頻繁地更新資料和統計資料的開發人員,最常見的兩個顧慮是防止作弊,以及在伺服器端儲存即時資訊,以供玩家之間的互動,或在遊戲意外結束時防止資料遺失。

作弊防護

雖然看起來您可能需要不斷更新後端資料以確保基本安全性,但如果您的遊戲不需要對工作階段進行完全以伺服器為權威的控制,頻繁更新幾乎是不必要的。首先,根本的問題是您實際需要多少安全性。 對於某些遊戲,特別是主要透過遊戲內廣告營利且沒有排行榜的遊戲,作弊並不是什麼大問題。在此情況下,信任用戶端傳送的資料通常是可行的做法,因為這些資料的安全性並不是真正的顧慮。為了識別作弊行為並決定如何處理,我們建議您實作程序來檢閱玩家的事件、資料和統計資料。 對於需要支援競爭公正性或保護整體玩家體驗的其他遊戲,更強的安全性就更加重要。根據您的特定需求,某些做法可以在這些情況下降低資料讀取和寫入的頻率。 如果您的遊戲不是即時的,我們建議的一種做法是在一段時間內彙總有關玩家遊戲的資訊——通常是遊戲的一個「回合」,持續數分鐘——然後將這些資料傳送至判斷其是否有效的指令碼。要評估的關鍵元素可能因遊戲而異,但需要考量的常見概念範例包括:
  • 距離上次工作階段報告已經過了多久,以及用戶端聲稱它在最近一次工作階段中遊玩了多久?
  • 玩家登錄了哪些分數,以及根據玩家的等級、裝備等,這些分數是否合理?
對於有更多即時需求的遊戲 (例如需要頻繁更新以伺服器為權威的玩家狀態),比頻繁更新 PlayFab 儲存之資料更好的解決方案是使用裝載的遊戲伺服器。在該模型中,您會在工作階段開始時將玩家連線至伺服器。伺服器會從服務讀取玩家所需的所有資料,然後隨著時間為該玩家裝載模擬狀態,用戶端則以您需要的任何速率與伺服器交換資料。接著,伺服器會在工作階段結束時,或如果您的工作階段特別長,則每隔幾分鐘,以玩家的最新資料更新 PlayFab 中的「長期儲存」。 這是即時多人遊戲所使用的模型。對於需要以伺服器為權威之檢查的單人遊戲,這也是有效的技術,不過如果每位玩家的頻率每分鐘只有幾次,Azure Functions CloudScript 可能是更好的選項。CloudScript 的總成本很容易計算。它是您耗用的總 GB 秒數,每次執行最少 128 MB 和 100 毫秒,再加上指令碼使用之任何其他服務 API 呼叫的一般計算。例如,如果您的指令碼程式碼和指令碼中的變數使用量總共佔用 250 MB 的記憶體,您需要執行該指令碼 4 秒 (最有可能是跨多位使用者) 才能達到 1 GB/s。而在該指令碼程式碼中,如果您讀取或寫入實體物件、遊戲資料、使用者資料等,您需要計算每個呼叫對設定檔計量的轉動量。由於裝載遊戲伺服器的成本取決於您執行的伺服器數目,而這又取決於一部伺服器一次可以裝載多少玩家,因此要判斷兩者之間的損益平衡點並不一定容易。但如果您發現需要高頻率地呼叫指令碼,且每次都需要從服務讀取和寫入資料,那麼遊戲伺服器解決方案很可能是更好的做法。

資料即時性

我們從設定檔寫入率高的開發人員那裡聽到的一個常見主題,是他們擔心玩家遺失進度。如果玩家在遊戲能夠儲存之前結束遊戲,且下次遊玩時無法使用本機狀態,或者該狀態需要在裝置之間移動,您會希望 PlayFab 儲存的玩家狀態資訊盡可能保持最新。 對於許多遊戲,您可以透過定期、低頻率地向服務傳送更新活動訊號 (例如每 15 分鐘) 來解決此問題。但加入額外的邏輯來延長或縮短該頻率也有幫助。例如:
  • 加入「重要更新」覆寫,如果玩家主動做了重要的事情,就會立即寫入並重設計時器,讓它不會遺失。
  • 如果您的遊戲在沒有玩家輸入的情況下持續進行,請考慮在長時間沒有輸入時延長活動訊號週期。這對於放置型遊戲特別重要,因為玩家經常讓它們整夜執行。
  • 為玩家提供直接強制更新的方式,例如使用者功能表中的按鈕。不過在此情況下,請務必節流從用戶端裝置實際對 PlayFab 發出呼叫的速率,讓重複按下該按鈕的玩家不會每次都產生一個呼叫。
如果用戶端在下次遊玩時確實有狀態資訊,您可以將本機的時間戳記與服務資料的時間戳記進行比較,並決定要使用哪一個,甚至讓玩家選擇。 玩家的設定檔資訊可能不只與玩家本身相關。在某些遊戲中,您可能需要跨玩家查詢,無論是為了激發競爭,或是透過非同步的好友互動、挑戰等直接影響玩家體驗。 對於競爭而言,排行榜是透過對服務的單一呼叫分享其他玩家的部分資訊 (通常是分數接近目前玩家的玩家),以產生這種張力的理想方式。由於可以使用設定檔檢視條件約束傳回其他設定檔元素 (例如統計資料和標籤),因此您可以呈現這些其他玩家的豐富資訊。但重要的是,不要逐一查看排行榜中所有玩家的清單,嘗試從每位玩家讀取其他資訊,因為這會迅速倍增設定檔讀取的總數,推高您的成本。 對於在工作階段中直接使用跨玩家資料的遊戲,最常見的最佳化是只讀取與本機玩家互動之少數特定玩家的資訊。對於即時動作遊戲,這通常在裝載工作階段的伺服器上完成。對於其他遊戲——例如玩家可以攻擊彼此基地的遊戲——最常見的做法是將所有資料讀取到本機裝置上,或只傳送本機玩家應知道的其他玩家資料子集給本機玩家。採用前者的遊戲會使用伺服器端邏輯評估用戶端傳送的最終結果。採用後者的遊戲會在工作階段過程中,於本機玩家應能存取時反覆以更多資料更新資料。但即使如此,它們也會使用伺服器端邏輯評估最終結果。同樣地,決定應該透過指令碼還是在裝載的伺服器上執行的關鍵在於頻率。如果每分鐘超過幾次,您最好針對需要該資料的工作階段部分使用裝載的伺服器。

經濟系統和物品欄

物品欄以及一般的經濟系統需要不同的做法。無法避免的事實是,如果玩家放棄了具有實際價值 (金錢) 或感知價值 (虛擬貨幣或可消耗容器) 的東西,他們會隱含地預期交易會被兌現。對於任何具有應用程式內購買的遊戲,玩家以真實世界貨幣進行購買所造成的設定檔計量遞增是微不足道的成本。在許多類型的遊戲中,物品欄更新的頻率夠低,對大幅增加整體用量的影響不大。但對於物品欄更新較頻繁的遊戲——即使您沒有遊戲內營利——也有一些最佳化技巧可以協助降低成本。 最佳做法是只從字面意義上看待物品欄,將其視為合理有限的物品欄。例如,在增量 (或「放置」) 遊戲中,可能會很想將玩家取得的每項資源都視為物品,每次玩家購買另一個時就遞增總數。但當您計算玩家採取這些動作的頻率時,這個模型很快就會崩潰。您會立即需要處理每位玩家在一個工作階段中衝擊計量數百甚至數千次的情況。對於這類情況,最好將這些元素視為使用者資料,並使用上方設定檔一節中的建議將其更新至服務。 對於物品欄更新率較高的遊戲,我們又回到了資料即時性的問題。例如,動作遊戲可能會追蹤玩家擁有的子彈數量,但該「堆疊」子彈的後端資料不需要在每次扣動扳機時都更新,特別是如果遊戲狀態是在裝載的伺服器中管理的。可堆疊物品可為您帶來效能和成本上的優勢,因為您可以將物品的許多虛擬執行個體表示為具有計數的單一實際執行個體。您通常可以隨時間彙總物品堆疊的變更,並在工作階段結束時或在整個工作階段期間定期更新它們。更新堆疊時,最好呼叫 Player Item Management - Modify Item Uses 來檢查您是否可以只變更堆疊的計數,而不是新增 N 個物品執行個體,每個執行個體都必須經過處理才能新增至堆疊,然後再進行清除。 就其本質而言,某些遊戲類型 (例如收集卡牌遊戲) 確實需要以稍高的速率更新玩家物品欄。但即使在這種情況下,仍有機會彙總物品欄變更並降低設定檔計量的總用量。例如,在使用掉落表的遊戲中,設計經常採用一種容器,從幾個不同的掉落表中各「抽取」一或多次。通常,如果這些抽取只是偶爾的動作,其增量成本小到不足為慮。但如果玩家可以收集許多這類容器,並在短時間內開啟多個,您可以提供「開啟 N 個」甚至「全部開啟」的選項。在此情況下,您可以使用 使用 Azure Functions 的 PlayFab CloudScript 或您的自訂遊戲伺服器,查詢 Player Item Management - Get Random Result Tables 以取得掉落表集合,或呼叫 Player Item Management - Evaluate Random Result Table 而不產生物品欄物品。接著,您只需在需要時新增執行個體,然後更新其餘物品堆疊的計數,就能更有效率地更新玩家物品欄。

內容和設定

設定檔主要與玩家有關,而內容和設定主要與遊戲有關。許多遊戲層級的元件,例如推播通知、電子郵件服務和遊戲新聞,都包含在此計量中。此外,這也是用來追蹤實體檔案用量的計量。同樣地,上傳和下載 CDN 檔案之 URL 的要求也在此計量上追蹤,不過請務必釐清,CDN 成本是分開的,並根據下載的總 GB 數計費,如內容傳遞網路 (CDN) 中所述。內容和設定讀取及儲存計量的計算方式與設定檔計量類似,都是以資料大小為基礎,不過單位顯然遠大於 1 KB。對於內容和設定寫入計量,則完全以寫入作業的總數為基礎,每次寫入都會讓計量遞增 1。 附帶一提,實體檔案系統是大型資料的建議服務,無論它是與遊戲、群組或個別玩家相關聯。對於每位玩家有大量資料存檔的遊戲,實體檔案系統通常更具成本效益;不過請記住,這些更新的頻率會影響所追蹤的用量。最好根據檔案需要更新的頻率,最佳化您需要的檔案數目。 就最佳化內容和設定計量的成本而言,最重要的是追蹤您的遊戲必須要求其很少變更之設定資料的頻率。這主要是遊戲資料,通常用於管理遊戲中所有使用者都相同的層面,例如遊戲平衡/調整資料、成就定義、當地語系化資料等。 對於使用 CloudScript 的遊戲,如果您發現每次呼叫指令碼都依賴此遊戲層級資料,您可能會想要考慮將該資料直接「內建」到指令碼中。您可以透過將其定義為指令碼本身中的硬式編碼資料這個簡單方法,或使用靜態變數作為快取手段,讓每個虛擬機器 (VM) 執行個體只從服務讀取一次資訊來做到這一點。如此一來,遊戲層級資料會在任何指定 VM 第一次執行您的指令碼時載入,並在該 VM 後續執行時重複使用。這裡需要記住三件事:首先,指令碼會被許多不同的使用者使用,因此不應將任何內容視為在個別使用者的執行之間是一致的。其次,資料的處理必須視為無狀態,因為單一玩家的每次呼叫可能會衝擊不同的電腦。最後,您需要追蹤該資料的存在時間並定期重新載入,以確保您擁有最新版本。

CloudScript

這是 PlayFab 服務的主要「擴充接點」之一,可讓您從用戶端裝置或伺服器執行以伺服器為權威的邏輯,甚至透過 PlayStream 規則觸發它 (例如,當玩家進入某個區段時)。與自訂遊戲伺服器裝載不同,您只需為指令碼執行的 GB 秒數 (GB/s) 付費,每次執行最少 128 MB 和 100 毫秒。因此,如果您的指令碼總共使用 250 MB 的空間 (指令碼程式碼和資料),它需要總共執行 4 秒——可能跨多次執行——才能達到 1 GB/s。 由於 CloudScript 的使用案例通常圍繞著代表玩家採取動作,因此我們已在前兩節關於設定檔和內容/設定計量的內容中,涵蓋了您應該考慮的大部分最佳化事項。不過,遊戲的總執行次數也會作為 CloudScript 用量計量的一部分進行追蹤,因此檢閱您需要以每位玩家為基礎呼叫 CloudScript 的頻率是很有價值的。對於某些遊戲,使用裝載的遊戲伺服器為作用中玩家提供「熱」資料存放區,可能會比嘗試在反覆的 CloudScript 呼叫中管理資料存放區更具成本效益。

Insights

此計量與 PlayFab 服務的所有分析功能相關聯,從事件擷取和匯出到事件歷程記錄搜尋和資料總管查詢。這裡的用量受到您需要事件處理的速度、想要保持「熱」裝載的事件資料量 (用於 Game Manager 中的查詢),以及您使用服務評估資料的程度 (無論是透過資料總管查詢或您直接連接到資料的視覺化軟體) 的影響。此計量同時受到遊戲內活動 (事件) 和遊戲外活動 (分析) 的影響。 最終,這表示 Insights 的成本是由您從玩家取得的事件資料量,以及您對這些資料進行的分析處理量所驅動。就最佳做法而言,上述關於事件的建議適用於前者,而對於後者,您可以透過兩種方式控制成本。首先,也是最簡單的,您可以在 Game Manager 中遊戲的 Insights Management 索引標籤中設定總儲存空間,以控制在 PlayFab 中保留的事件資料總量。接著,在同一個索引標籤中,您可以為遊戲設定效能層級。這會決定配置給遊戲的 CPU 資源總量,以及在事件歷程記錄中保持「熱」狀態以供查詢的資料量。每項所需的量取決於您資料分析小組成員的需求,因此最好與他們一起檢閱,以了解您的設定應該是什麼。 如需 Insights 及其使用方式的相關資訊,請參閱什麼是 PlayFab Insights。 如需 Insights 最佳做法的相關資訊,請參閱最佳做法和常見問題集。

多人遊戲服務

這是所有計量中最簡單的,因為定價完全沒有變更。簡而言之,裝載的多人遊戲伺服器和 Party 服務一直都是以用量為基礎收費。 特別是對於裝載的遊戲伺服器,您可以最佳化在任何指定時間必須執行的伺服器核心數,以支援盡可能多的玩家,從而將成本降至最低。 如果在這些伺服器上低 Ping 時間很重要,您可以選擇要在哪些區域執行伺服器。對於大多數遊戲,最大的玩家集中區域僅限於某些關鍵區域,但如果您的玩家群分佈很廣——特別是當您的遊戲處於長尾階段時——您需要權衡在玩家附近的每個區域執行伺服器的成本,與較長的 Ping 時間對玩家稀少區域中部分玩家的影響。有一件事可以對此有所幫助,就是確保您使用我們的 QOS 服務來選擇要將玩家放在哪些區域,然後判斷一個區域需要多少最少玩家人數才可行的界限。

管理您的上線遊戲

以上涵蓋了計量的基本概念,但一旦您的遊戲上線後,您應該考慮什麼?管理您的玩家社群主要涉及分析 (上方一節中的 Insights) 以及內容和設定的更新。此外,大多數遊戲都需要在玩家與遊戲本身的正常互動之外與他們互動。從重新參與活動 (吸引玩家回來)、元遊戲活動的社群獎勵,甚至是感謝玩家在遊戲之外的社群貢獻,現今的常見做法是使用 LiveOps 技術讓玩家保持高度參與。 其中一個關鍵是確保您有效地將區段鎖定在明確定義的群組,不只是為了降低成本,也是為了確保您的邏輯能快速處理。以玩家重新參與為例——讓玩家在停止遊玩一段時間後回來。處理此問題的一個好方法是定義幾個流失使用者的時間範圍,例如 3 天、7 天和 21 天未遊玩的玩家。對於每一個時間範圍,您可以採取不同的重新參與做法,從簡單的「我們想念您」訊息開始,最後是「這裡有一些免費的金幣/能量等」訊息 (當然,同時自動將其新增至玩家的帳戶)。對於每一個時間範圍,建議的做法是根據玩家上次登入遊玩遊戲的時間定義一小時的時段。如此一來,您不只是鎖定他們上次遊玩的時間,還能將區段中的玩家集合保持在最小,以盡可能提高作業效率。使用每小時對每個區段引發一次的排程工作,您可以傳送訊息,並將任何物品或虛擬貨幣 (VC) 新增至玩家物品欄。

摘要

最終,是您的遊戲所需的功能決定了它對 PlayFab 等後端服務的用量。實際上,這一切都歸結為一個全面性的問題:您對這些功能有什麼需求?無論您優先考量的是安全性、資料即時性、玩家互動/競爭的程度,還是完全不同的其他事項,都有許多因素可能會促使您與後端資料進行更高程度的互動。能夠以批判的眼光看待這些需求,並辨別哪些是硬性需求、哪些不是,就非常類似於最佳化遊戲中的任何其他程式碼。這是仔細查看資源使用率高的地方,並決定您是否真的需要它這麼高,或是否有方法可以重新設計該邏輯以降低用量的問題。 如果互動是即時的玩家對玩家互動,則取決於該互動的複雜度。對於大多數此類遊戲,管理模擬狀態且只在工作階段結束時 (如果工作階段很長,則每隔幾分鐘) 更新後端資料的裝載伺服器,通常是最佳解決方案。但在很多情況下,互動是完全受信任的,例如合作遊戲,或只與 (或對抗) 好友遊玩的遊戲,將作弊的誘因降至最低。還有一些遊戲對於必須如何檢查工作階段資料只有最低需求,允許雙方玩家在每次工作階段後直接提交報告,讓伺服器端檢查可以比較兩者。 對於任何沒有即時需求的遊戲,請考慮玩家是否真的需要精確到秒的準確度。在具有強烈社群互動的高度競爭遊戲中,情況很可能是如此。但對於許多遊戲而言,過時幾分鐘的資訊並不會影響玩家體驗。
最後修改於 2026年10月8日