vibe coding 做小游戏·问题排查篇:解决包体积、引擎适配与 iPhone 机型适配问题

0 阅读12分钟

游戏现在的样子

上图是游戏现在的首页和闯关画面。前四篇讲了开工、美术、战役玩法和 Mac 试玩包。这一篇讲第一个正式上线平台:微信小游戏。

10 月 27 日到 30 日,Claude Code 把这个 Godot 4.7 写的塔防游戏导出成了微信小游戏,在开发者工具和我的 iPhone 上跑了起来。过程中有四个问题:微信不官方支持 Godot,要走社区模板;包体第一次组装出来约 22.6 MB,被预览服务器以超过 20 MB 拒收,两天后压到 12.9 MB;iPhone 上黑屏,原因是 iOS 必须开高性能模式,而测试号开不了,我已有的小程序账号也改不成小游戏,只能重新注册;真机加载要等 2 到 5 分钟,加了诊断,根因还没有查清。本文按这个顺序讲。

这几天里,写代码不是最慢的环节。10 月 27 日上午我说「开始」之后,AI 用 13 分钟交付了组装脚本、中文字体和测试,此后的时间大多花在两类它够不着的事情上:一类是只能由我做的操作,注册账号、填身份证、扫码验证、在后台点「立即申请」;另一类是只有真机和服务器才会暴露的约束,比如包体上限。组装脚本最初按 30 MB 检查总包,推送预览时才被服务器告知实际执行的是 20 MB。

所以这一篇里,AI 的价值主要不在代码量上,而在于每次碰壁之后能把原因说清楚:哪一步是平台规则,哪一步要我本人来做,哪一步它还没查明。真机卡在加载页那件事,它到现在也没查出原因,但查清了一个前提:模板在加载出错时既不报错、也不更新画面,所以无论卡在哪一步,屏幕上看起来都一样,没法判断。它先把每一步的状态显示到屏幕上,等下次卡住时截图定位;原因没查到之前,它没有拿猜测当结论。

微信不官方支持 Godot,AI 没用社区插件

10 月 27 日上午我问:「微信不支持 godot?」AI 查了它前几天存下的微信官方引擎支持表:Cocos、Laya、Egret 由引擎内置导出,Unity 和 Unreal 走 WebAssembly 转换,Godot 归在「其他原生引擎」,状态是「需评估」。Godot 的网页导出本身就是 WebAssembly,技术上走得通,但适配工作要靠社区模板。它推荐了一个有 4.7 版模板的社区项目,同时列出风险:社区维护、引擎压缩后约 5 到 6 MB 超过 4 MB 主包上限要分包、iOS 必须开高性能模式、没有系统字体。

它建议先花一两天做导出验证,下载前问了我:编辑器插件约 0.4 MB,导出模板约 11.2 MB,两样都来自 GitHub。我同意后它开始做,最后只用了模板,没用插件。原因有两个:读源码发现插件导出的资源包文件名和 4.7 模板的入口对不上,直接用会跑成模板自带的示例;插件是要加载进编辑器的第三方原生代码。它改为自己写组装脚本,只取模板里的引擎和加载器,插件没有在我的电脑上执行过。

小游戏里没有系统字体,中文会显示成方块。AI 用电脑上已有的思源黑体(OFL 开源授权)裁出游戏用到的 427 个字,字体文件 111 KB。组装结果是主包 0.63 MB、总包约 22.6 MB,432 个测试通过,新增 make wechat 命令。

用开发者工具自带的 agent 命令行跑模拟器

微信开发者工具 2.02 自带一套给 AI 工具用的命令行,能打开工程、截模拟器的图、读 console、模拟点击、推送到手机预览。用之前要给客户端授权,同时打开工具「安全设置」里的「服务端口」。AI 发了三次授权请求都没有回应,查日志发现工具根本没收到请求;它没有替我去改安全设置,而是让我自己打开服务端口,之后授权一次成功。

模拟器里的结果:引擎正常启动,WebGL 2.0,约 55 帧,最慢一帧 22 ms。这一段还踩了几个工具上的坑:

  • 官方指南写明游客 AppID 在这条路径上无效,要改用测试号;
  • 每次重新组装工程后,必须关掉项目窗口再打开,否则模拟器跑的还是旧代码,推送预览也会失败;
  • 截图可能滞后于实际画面,点击进了游戏但截图没变。

22.6 MB 被拒,第一轮压到 12.9 MB

包体压了两轮

第一次推送真机预览失败,报错是 code 10,日志里只有 [object Object]。AI 去读了工具上传这段代码,查出原因是总包超限:服务器执行的上限是 20 MB,而它的组装脚本按 30 MB 检查。它先写了一条测试:超过 20 MB 的工程应该被拒绝,确认测试失败后再改上限。

压缩分两步。10 月 27 日下午,三张大图(征途背景、启动图、图标)改成质量 0.85 的有损 WebP,从 3.18、1.95、1.14 MB 降到 0.65、0.41、0.24 MB,总包降到 17.62 MB,推送成功。

第二天我反映加载太慢,AI 先量了一遍包里有什么,又做了两项:微信版不再带桌面版用的启动图和图标原图,省 3.5 MB;6 张地面和道路贴图改成有损压缩,从 1.57 MB 降到 0.29 MB。改之前它先渲染了草地、沼泽、沙漠三张地图作为对照,改完再渲染一遍并排比较,肉眼看不出差别。总包从 17.66 MB 降到 12.94 MB。

剩下的大头是引擎本身:godot.wasm 压缩后 8.4 MB,游戏资源包 3.8 MB,JS 胶水代码 0.5 MB。引擎是模板作者打过补丁、预先编译好的,自己编一个精简版要单独维护编译流程,AI 建议先不做。

包体后来又涨回去了。10 月 29、30 日加了新兵种、新敌人和法术图标,10 月 30 日我看到总包 19.52 MB,离上限只剩约 0.5 MB。这一轮 AI 把 109 张原本存为无损 PNG 的贴图改成质量 0.9 的有损 WebP,并在项目设置里把新图默认设为有损,降到 16.01 MB;再按显示缩放比例给大背景图分别设置质量和 mipmap,启动页背景在打包时缩到 720 宽,4 首背景音乐从 Vorbis q4 降到 q3,降到 14.82 MB。音乐它没法试听,交付时专门提醒我在手机上听一下,觉得发闷就改回 q4,只多 0.26 MB。

iPhone 黑屏:高性能模式、测试号和重新注册的账号

三个账号只有新注册的能用

10 月 27 日晚上,我说:「我是 iphone,加载完了仍然黑屏了。」AI 判断最可能的原因是运行模式:模板说明写明,iOS 上必须在小游戏后台开通高性能模式才能运行 Godot 引擎。它引用的官方文档说法是:Godot 4 画图要用 WebGL2,而 iOS 要到 15 才有 WebGL2。我们用的测试号只有开发者 ID 和服务器域名几项设置,没有完整后台,开不了这个模式。

我说我有一个小程序账号,问能不能用。AI 用开发者工具查了我名下的 AppID,那个账号是小程序类型。它让我扫码完成管理员验证后,点开「添加类目」看了一眼:可选的一级类目只有 9 个,餐饮、物流、交通、生活、旅游、工具、商业、体育、教育,搜不到「游戏」。微信官方文档写明,小游戏的一级类目「游戏」只能在注册时勾选,之后不能修改。它点了「取消」,什么都没选、没提交,结论是这个账号用不了,要重新注册一个。

注册这一步 AI 没有代做。我让它「你来帮我操作」,它的回答是:创建账号、填写密码、填身份证号这几步不在它能做的范围内,即使我授权也一样。它能做的是在每一步看页面,告诉我该选什么。它列出的要点是:用一个从没注册过任何微信平台账号的新邮箱;主体选「个人」;注册时一定勾选「游戏」;个人主体的二级类目不能选角色、牌类和文化互动,塔防选「策略」或「休闲」。

新账号注册好后,AI 在后台找到了「游戏能力地图 → 研发能力 → 生产提效包 → 高性能模式」。它去点「立即申请」时,被自动模式的权限检查拦了下来,理由是这一步会改账号设置,要本人确认。我点完一次,它刷新页面、读了查状态的接口,发现状态码和没申请过的项目一样,判断还没开通,让我再点一次。第二次页面显示「已开启」:最低 iOS 14.0,高性能+ 模式要求微信 8.0.45 以上。

这里有一个缓存的坑:开通之前在 iPhone 上打开过的游戏,会被缓存成普通模式,开通以后要先从微信里删掉再重新进。AI 在开通前一直没往手机上推新 AppID 的预览,就是为了避开这一点。开通后第一次推送,iPhone 能进游戏了。

灵动岛:顶栏让开状态栏,又挡住了出兵口

能进游戏之后,我说顶部有元素被灵动岛挡住。AI 让游戏读取微信报告的安全区,各个界面和关卡的顶栏、底栏都让开了状态栏和底部横条。测试一开始没过:无头测试的窗口默认是正方形,而且量尺寸时布局还没排好。它改成先换成手机尺寸、等两帧再量,每个界面打开时当场测量。

推到手机后出现了新问题:顶栏往下挪,正好压住了地图顶部的出兵口。AI 改成地图跟着顶栏一起往下移,但只移到底部余量用完为止,不让地图底部滑到横条下面。

真机卡在「正在加载资源」,根因还没查清

加载的四个阶段

这一节的问题到现在还没有闭环,只写做了什么和确认了什么。

10 月 27 日第一次推到手机,就一直停在模板的「正在加载资源」。AI 看了模板的加载流程,发现分包下载没有失败回调:下载失败或卡死时,微信既不回成功也不回失败,画面就停住。它先补了失败弹窗和重试,又把加载页改成显示具体数字,例如「35%(6.2/17.7MB)」,用来区分「在下但很慢」和「根本没开始」。结果是能下完,但从推送到下完要 2 到 5 分钟。

第二天我说:「还是会卡住,这到底是为什么,彻底排查一下。」开发者工具的命令行开不了真机调试,AI 改为让手机自己把状态显示出来,并解释了之前为什么看不出卡在哪一步:

  • 下载完成后,模板还要编译引擎、读入 3.8 MB 的游戏包、启动引擎,这三步都没有失败处理,哪一步出错画面都停在加载页;
  • 下载一完成,加载页就固定显示「引擎初始化中」,之后模板只改文字、不重画屏幕,卡在哪一步看起来完全一样。

它写了一个加载监视脚本打进包里:加载页每秒重画,显示当前阶段、已等秒数和实时网速,任何脚本错误或引擎启动失败都弹窗写明原因。这个脚本它在 node 里用模拟的 wx 跑过,开发者工具那次没抓到控制台日志,所以还没在模拟器里确认。

我又问下载的是什么、有没有国内的源。AI 的回答是包里的东西全部由微信自己的服务器分发,已经是国内,换不了源。自己托管资源要有 ICP 备案的域名,引擎那 8.4 MB 也仍然要走微信分包,它不建议现在做。它提到一个猜测,开发版预览可能被限速,但明确标了「没核实过」,并给出验证办法:看新加载页显示的网速,或者上传一个体验版对比,上传要我同意。

这两项验证都还没做,所以本文不下结论。

首页不放广告按钮,并用测试守住

微信版能跑以后,我提了一个产品要求:「首页尽量精简,不要有那么明显的广告元素,很容易劝退用户的。」原来首页底部有一块领地税收面板,上面是金色的「看广告 3 倍领取」按钮。AI 去掉了这块面板,改成钻石旁边一个有税可领时才出现的「+N 领」小角标,点一下直接领。广告位只保留在关卡里:结算时的翻倍奖励和战斗危急时的急救。

它同时加了一条测试:首页一旦再出现广告按钮就报错。这和上一篇「打包后用安装包自己打一关」是同一个做法,把一次口头要求变成每次构建都会检查的规则。

这一次的几条做法

做法原因
第三方插件读过源码再决定用不用插件和 4.7 模板入口对不上,且是要进编辑器的原生代码
平台限制以服务器实际执行的为准,并写成测试脚本按 30 MB 检查,服务器执行 20 MB
压缩前后各渲染一遍对照地面贴图从 1.57 MB 压到 0.29 MB,画质要有证据
账号、身份、后台开关由本人操作注册和「立即申请」都要本人;AI 只看页面、给建议
判断「能不能用」先只看不选类目选定后不能改,查看时点「取消」不提交
加载出问题先让它可观测模板既不报错也不重画,看不出卡在哪一步
猜测标明未核实,给出验证办法「预览版限速」没验证前不当结论

真机加载这件事还没结束,查清以后会在后面的篇目里补上。下一篇讲上线前的资质手续,包括软著申请里那句「未使用 AI」的承诺。