独立开发者一枚。我的类《吸血鬼幸存者》游戏《Just Dying》现在可以在浏览器中试玩了,过去几个月我花最多精力优化的就是敌人数量。我想分享一下为此付出的代价——因为几乎没有任何一部分是我预想的那样。

最初那个简陋版本在约200个敌人时就会卡死。问题不在于绘制它们本身,而在于绘制周围的一切。

真正带来改观的因素,大致按帮助程度排序如下:

敌人不再作为独立精灵存在。现在它们被放进一个粒子容器中,整个群体只需一次批量绘制调用,只有Boss和精英单位仍保留带独立动画骨骼的真实精灵。仅此一项就带来了绝大部分提升。代价是:群体无法执行任何批量粒子做不到的操作,而且我添加的每个视觉特效现在都要写两套实现——每套对应一条路径。

碰撞检测移到了Web Worker中。弹道物理、命中判定和持续伤害都在主线程外运行,主线程只读取结果。主线程版本仍保留在代码中作为回退方案——这在维护上是个错误,因为现在我必须保证同一套规则的两个实现完全一致。

邻域查询使用了空间哈希,这很直观,但关键的细节是池化了返回的集合。每帧每查询都分配一个新集合,悄无声息地产生足够多的垃圾,导致明显的GC卡顿。

还有大量不那么光鲜的工作:手动裁剪(如果你直接渲染,Pixi 8不会帮你裁掉不可见内容)、到处设置脏标记以避免重复计算未变化的值、以及消灭所有我能找到的每帧分配。

我卡住的地方:在我的机器上跑得很好,但我的机器只是一个数据点。浏览器版本是最恶劣的情况,没有底层原生应用来吸收糟糕的帧。所以我真的不知道它在集成显卡的笔记本上能否顶住,而我一个人没法测试所有情况。

如果你想搞崩它:https://justdying.itch.io/just-dying

它在标签页中运行,无需下载。按0开启调试覆盖层,显示FPS和实体数量。如果你更想用原生版本,也有Steam试玩版:https://store.steampowered.com/app/4646190/Just_Dying/

如果帧率在你的设备上崩了,我很想听到你的反馈。告诉我是哪款GPU和浏览器,以及大致在什么情况下发生的就够了。