用帧时间定位掉帧从一次尖峰开始,分辨 CPU 和 GPU 的开销。
先在目标设备录制固定场景,让相机按同一路线运行。60 FPS 的单帧预算约为 16.7 毫秒。平均帧率可能掩盖短暂卡顿,因此同时看帧时间曲线和第 99 百分位。
把尖峰与资源加载、渲染提交和内存分配事件对齐。降低渲染分辨率再采一次,如果 GPU 时间明显下降,继续检查过绘制和后处理。如果尖峰几乎不变,就优先检查主线程上的同步 I/O 或垃圾回收。
先在目标设备录制固定场景,让相机按同一路线运行。60 FPS 的单帧预算约为 16.7 毫秒。平均帧率可能掩盖短暂卡顿,因此同时看帧时间曲线和第 99 百分位。
把尖峰与资源加载、渲染提交和内存分配事件对齐。降低渲染分辨率再采一次,如果 GPU 时间明显下降,继续检查过绘制和后处理。如果尖峰几乎不变,就优先检查主线程上的同步 I/O 或垃圾回收。
先固定地图、起点、终点和移动规则。对四方向等成本的网格,A* 可以使用曼哈顿距离。用不同颜色标记候选格、已访问格和最终路径,并加一个逐步执行键。
遇到角色卡在拐角时,先暂停移动逻辑,只画寻路结果。如果路径本身正确,再检查角色碰撞体和转向插值。保存当时的地图与端点,就能在每次改动后重放同一个问题。
为生成器单独维护一个随机数序列,避免粒子或音效改变它的状态。记录 seed、生成器版本和输入参数,再保存生成结果的摘要。
从最小约束开始验证,例如出生点与出口连通、关键物品在可达区域内。批量跑种子时遇到失败就保留输入,下次改算法后先用这些失败案例回归测试。
一本面向独立游戏开发的技术笔记,收集可以在小场景里验证的做法。