旋旋小精灵
雾气下沉的松林,取自维基共享资源

技术笔记 · 何凯旋

2026 年起

微信小游戏 / 帧同步 / 性能

--:--

笔记是暗室里 被点亮的一行字

往下看 · 共有 4 篇

我把踩过的坑写成能复用的步骤:先量,再改,最后用真机验证。写下来是为了下一次不再重来。

雪山下的小村,水墨风景
雪山下的小村 · 水墨
三棵树,1850 年墨水淡彩
三棵树 · 1850

四篇笔记

雾中的红松林,取自维基共享资源

雾中的红松林 · 加拿大

  1. 微信小游戏主包限制 4MB 之后,能砍的只有两样:图和逻辑。先说结论——首包只放首屏必需的三类资源,其余全部走分包预下载。

    三类必需:首屏背景一张、角色图集一份、UI 图集一份。纹理统一走 ASTC 或 ETC2,尺寸按目标设备最长边下调,不要 2048 全量铺开。分包在 Loading 场景里并发预下载,下完的包在内存里只留索引。

    量的方式很直接:构建产物按目录排序,看每一项的字节数;真机上再跑一遍冷启动,记录从点击到可交互的毫秒数。两个数对不上,就是预加载顺序错了。

  2. 打开 strict 之外,我额外加了两个开关:noUncheckedIndexedAccess 和 exactOptionalPropertyTypes。它们会逼你把数组越界和缺省字段当成必须处理的分支。

    定点数物理层受过一次益:fps[i] 在严格模式下变成可能为 undefined,逼着每个读写点写显式断言。运行时的空指针崩溃因此少了一整类。

    代价是要多写判空。我的做法是在边界处一次性收窄,逻辑层只接受已确认的值,别把断言散到每个函数里。

  3. 逻辑固定 30fps(步长 0.033 秒),渲染跑 60fps,中间靠插值把两次逻辑快照之间补平。不插值会看到明显的阶梯感,尤其在摆荡到最高点的时候。

    插值只动画面,不动位置:渲染层拿上一帧和当前帧的快照做线性混合,角度、绳长、速度全部插,唯独锚点归属这种离散状态不插。

    要注意时间基准。用固定步长累加而不是每帧 dt 累加,否则掉帧时会追帧、逻辑步数漂移,帧同步两端就开始各打各的。

  4. 流程是固定的:备案 → 解析 → 证书 → 反代 → 微信后台白名单。任何一步顺序反了都会多耗一周。

    反代有个容易被忽略的点:宝塔自动生成的配置把 /.well-known/acme-challenge/ 也代理给了后端,证书申请直接 404。要先加一条优先匹配的静态 location。

    WebSocket 还要补三行升级头,否则握手停在 400。证书 90 天一轮,续签失败不会报警,掉证那天玩家只看到「网络异常」。

位置
北京

在做
微信小游戏

可聊
性能与帧同步

何凯旋,写代码的人,做一款四人同屏的武侠斩绳小游戏。白天调物理和网络,晚上把过程记成能照做的步骤。这个站点只有一个目的:让下一次的我不必重新踩一遍同样的坑。

笔记里出现的数值都来自本机实测或真机日志,不是估的;写错的地方会标注日期。转载注明出处即可。

雾气中的松林

写封信

有具体问题,或者想看看同一套帧同步换到别的玩法上会怎样,直接发邮件。

回复时间
通常 48 小时内
可讨论
性能 / 帧同步 / 小游戏上线
发邮件