PlayFab 消费:最佳做法
借助 PlayFab 基于消费的定价模型,您只需为游戏的实际服务使用量付费。但这引出了一个显而易见的问题:如何才能在实现所需的所有功能的同时,最好地优化这些游戏以节省资金?在本文档中,我们将深入探讨这些细节,并讨论有助于您提前规划的最佳做法。 在您将游戏从开发模式迁移到正式环境之前,可以在 Game Manager 的账单摘要选项卡中查看计量表信息。 有六种消费计量表:事件、配置文件、内容和配置、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 功能驱动独特体验的元信息,例如上面提到的用户分群。此外,一些游戏级别的旧功能,例如游戏数据 (Title Data)、目录和商店,也包含在此计量表中,因为它们的数据实现实际上与用户数据相同。由于此计量表集是由所有玩家操作以及对玩家的操作驱动的,因此它绝对是最需要优化规划的。 导致定价计量表所捕获使用量的主要因素是读取、存储和写入的数据量,以及您调用生成计量数据的 API 的频率。 有关导致这些计量表”跳动”的具体 API 调用的更多信息,请参见 定价计量表。 我们将从用户数据和统计信息开始,因为它们的使用模式相似,然后再讨论玩家库存管理。数据和统计信息
在评估您对用户数据的使用时,同样的近似逻辑与事件相同——每 1 KB 使计量表计数增加 1——不过请记住,出于计算目的,调用的每个”元素”都应视为不同的。对更新用户数据的调用中的每个键值对是分开计数的。对于读取,此 1 KB 计算适用于返回的总数据,与键值对的数量无关。这意味着写入 10 个 100 字节的键为配置文件写入计量表的 10 个”跳动”(因为每次键值对写入至少为 1 KB),而读取这 10 个键则为 1 个”跳动”,因为总共为 1 KB。有关使用情况的更具体详细信息,请参见 定价计量表。 统计信息稍微复杂一些,因为它们更新配置文件,也可能对排行榜产生影响。作为一般规则,您可以将每次更新的统计信息视为一次完整的配置文件更新,而读取则基于每次调用中读取的数据总大小。由于存储按每 GB 计价,而统计信息通常每个只消耗几个字节,我们将重点关注读取和写入。 由于总数据大小很重要,因此优化它是第一步。幸运的是,有各种众所周知的技术可以做到这一点——使用枚举或 ID 代替项目的完整拼写文本、将大数据打包为二进制,或者甚至使用位字段将数据打包到较小的空间中。完成此操作后,下一步是仔细评估您需要何时进行这些读取和写入调用。 如果您是从 PC 或主机开发——特别是单人游戏——转过来的,这可能是一种新的模式。但在那些环境中,您必须小心客户端设备上的资源占用和垃圾回收,因为它们可能在关键时刻导致性能下降。当您的游戏使用云端资源时,有必要扩展该逻辑,将每次资源占用视为除性能成本之外还有实际成本。 如何确定读取和写入的最佳频率?想要更频繁地更新数据和统计信息的开发者最常见的两个考虑因素是防止作弊,以及在服务器端保存及时信息,以便进行玩家对玩家交互或在游戏意外退出时防止数据丢失。防作弊
虽然您可能觉得需要不断更新后端数据以确保基本安全,但如果您的游戏不需要完全的服务器权威式会话控制,频繁更新几乎是不必要的。首先,根本问题是您实际需要多少安全性。 对于某些游戏,特别是那些主要通过游戏内广告获利且没有排行榜的游戏,作弊并不是主要考虑的问题。在这种情况下,信任客户端上传的数据通常是可行的方法,因为该数据的安全性并不是真正的问题。为了识别作弊行为并决定如何处理它们,我们建议您实施审查玩家事件、数据和统计信息的流程。 对于其他需要维护比赛完整性或保护整体玩家体验的游戏,更强的安全性更为重要。根据您的具体要求,某些方法可以在这些情况下减少数据读取和写入的频率。 如果您的游戏不是实时的,我们建议的一种方法是聚合一段时间内(通常是游戏的一”局”,需要几分钟)关于玩家游戏的信息,然后将该数据发送到一个脚本,由其判断是否有效。要评估的关键元素可能取决于游戏,但一些要考虑的常见概念示例是:- 距离上次会话报告过去了多长时间,客户端说它在最新的一次中玩了多长时间?
- 玩家注册的分数是多少,考虑到他们的等级、装备等,这些分数对该玩家来说合理吗?
数据的时效性
我们从配置文件写入率较高的开发者那里听到的一个共同主题是,他们担心玩家会丢失进度。如果玩家在游戏保存之前退出,且下次玩游戏时无法使用本地状态,或者该状态需要在设备之间传输,那么您希望玩家的 PlayFab 存储状态信息尽可能是最新的。 对于许多游戏,您可以通过定期、不频繁地向服务发送心跳更新(例如每 15 分钟)来解决此问题。但包含额外的逻辑来延长或缩短该频率也可能有所帮助。例如:- 包含一个”重要更新”覆盖,如果玩家主动执行了重要操作,就会导致立即写入并重置计时器,这样就不会丢失。
- 如果您的游戏在没有玩家输入的情况下继续进行,请考虑在长时间没有输入的情况下延长心跳周期。这对于放置类游戏尤其重要,因为玩家经常整晚让它们运行。
- 为玩家提供一种直接强制更新的方式,例如用户菜单中的按钮。但在这种情况下,请务必限制从客户端设备到 PlayFab 的实际调用速率,以便玩家一次又一次地按下该按钮时不会每次都生成一个调用。
