玩家换手机时,他的进度去哪了?
一个玩家在你的游戏里泡了六个月,买了赛季通行证,打到 400 关——然后换了新手机,进度没了。客服工单堆起来,商店评论变凶,而根因是你第一天做的一个没意识到其后果的设计决定。下面讲"换手机"要真的等于"接着玩",底层到底得成立什么。
Q:为什么设备 ID 不是存档系统?
因为设备 ID——IDFA、GAID、Android ID——是归因令牌,不是身份。它出厂重置会清、换设备会没,而且越来越被隐私弹窗挡住(ATT、GDPR、平台默认值)。玩家一换硬件,那个 ID 就没了;如果你的进度是挂在它上面的,账号也跟着没了。身份得来自玩家随身带的东西:邮箱、手机号,或 SSO。别的任何东西,都会悄悄把一次手机升级变成数据丢失,而玩家怪的是你的游戏,不是他的系统。
Q:云端存档冲突,怎么解才不删玩家的东西?
最后写入获胜(last-write-wins)是个陷阱:玩家离线玩了三天,一上线,他新鲜的本地进度被周二那份过期的云端文件覆盖。版本向量和操作日志(CRDT)合并干净,但存储和工程量你可能不需要。对休闲游戏,字段级乐观合并是甜点——把货币、关卡、装饰当独立字段分别合并,每个字段取较高或较新的值——冲突率低,几乎不丢东西。坑在:先定什么算真相。服务端权威字段(货币、解锁)必须服务端校验,不能信客户端时间戳。
Q:离线优先还是云端优先?
离线优先:本地先玩、后台同步——弱网下顺,但冲突率更高、作弊面更大。云端优先:每次操作都问服务器——干净,但一断网就不可用,在连通性是例外的市场是致命的。务实答案对休闲游戏是离线优先 + 后台合并 + 对少数要紧字段做服务端校验。你用一点冲突处理,换一个到处都能玩的体验。
Q:怎么阻止作弊者伪造存档?
本地存档是一份明文 JSON,玩家用文本编辑器或内存修改器就能改——货币设到九百亿、解锁一切。防御从协议层开始:任何值钱的东西,别让客户端持真值。货币和解锁服务端签名或存权威,每次同步都校验,再跑异常检测(一天涨了十年货币的不是 bug,是标记)。反作弊不只是事后封号;存档格式本身就该让伪造变得没用。
| 策略 | 冲突丢失 | 成本 | 适合 |
|---|---|---|---|
| 最后写入获胜 | 高 | 极小 | 可丢的数据 |
| 版本向量 / CRDT | 无 | 高 | 协作状态 |
| 字段级合并 | 低 | 中 | 休闲游戏 |