Cocos4 源码

看了下 Cocos4 仓库,有 90 多个提交了。
其中一个提交:
https://github.com/cocos/cocos4/commit/e913d77704ac1ce670cafae0981c0e304a34f0f3

这个改动一开始有点奇怪。分量越长的,容错越大,至少保证一个单位的容错系数。为什么这么改呢,看来是有新的应用场景触发了这样的改动。

问了下 AI,可能的触发场景。

这种改动通常是由于在实际开发中遇到了因绝对误差过严而导致的 Bug。在 Cocos 引擎中, equals3f 方法很可能被用于比较三维向量(如位置、缩放、旋转等),以下是一些典型的触发场景:

  1. 大世界坐标
    当游戏场景很大,物体的世界坐标达到数千甚至更大时,例如一个开放世界游戏,角色位置 (5000.0, 0.0, 5000.0) 。由于浮点数精度,两次计算得到的坐标可能相差 1e-5 ,如果原 epsilon1e-7 ,就会判定不相等,可能导致角色移动判定出错或动画状态异常。
  2. 连续变换累积
    物体经过多次旋转、缩放、平移后,其变换矩阵反复计算,累积的浮点误差可能变大。比较两个本应相同的变换结果时,原来的绝对误差容易失效,而相对误差能更好地容忍这种累积误差。
  3. 物理引擎交互
    物理模拟中经常需要比较位置、速度等向量。当物体高速运动或处于大范围空间时,相对误差比较能保证模拟的稳定性,避免因微小绝对误差导致的“抖动”或错误碰撞响应。
  4. 网络同步验证
    在多玩家游戏中,服务端和客户端的坐标可能因网络延迟和浮点运算差异而略有不同。使用相对误差比较可以更宽容地认为两者一致,减少不必要的状态修正。

这次修改让 equals3f 方法 从“固定精度”升级为“自适应精度” ,大幅提升了引擎在处理大数值和复杂运算时的鲁棒性,属于一次防患于未然或修复已出现问题的优化。

再看下下一个比较有意思的提交:


我以为小游戏写入文件用异步 api 是基本操作。。。3.8 写入竟然是用的同步。。。

equals3f的修改其实主要是由于 Vec3的equals3f 与 Vec2的equals2f和Vec4的equals4f 都是同类型的api但是实现却不一致
引擎组评估后将equals3f方法的实现修正

原来是这样啊,懂了