getBoundingBox() 精度问题导致计算不一致的BUG[已解决]

2.0.5

我最近在做一个帧同步的游戏,然后发现 getBoundingBox() 精度问题导致计算不一致!!
getBoundingBox () {
this._updateLocalMatrix();
let width = this._contentSize.width;
let height = this._contentSize.height;
let rect = cc.rect(
-this._anchorPoint.x * width,
-this._anchorPoint.y * height,
width,
height);
return rect.transformMat4(rect, this._matrix);
},

this._matrix的值:

m00: -0.4
m01:
4.898587196589413
e-17
m02: 0
m03: 0
m04:
-4.898587196589413
e-17

m05: -0.4
m06: 0
m07: 0
m08: 0
m09: 0
m10: 1
m11: 0
m12: -52
m13: -90
m14: 0
m15: 1

m01 m04已经有精度问题了

导致getBoundingBox() 方法 在不同浏览器 同一个node 同样position rotation size 居然 获得的x y 不同

rect:
height: 11.199999999999989
width: 11.200000000000003
x: -57.6
y: -97.6

请问这个是否属于bug

又经过测试 就算this._matrix 没有精度问题,不同浏览器下

同样的node 同样 position rotation size 居然 获得的x y 不同

我是这样操作的,控制固定200ms间隔移动
但是发现不同浏览器下不是每步获得x y一致,导致误差越来越大

例如A浏览器下
node position:(-42.00, -202.00) getBoundingBox 获得x y -48 -207.6

在B浏览器下:
node position:(-42.00, -202.00) getBoundingBox 获得x y -47.6 -207.6

x 坐标产生了0.4px误差

可以重现 但是我给不了demo

在chrome 调试的时候 无法跟踪到transformMat4 方法所以也没办法查明具体原因. web平台

可以重现 但不是每帧都会出错, 例如第一二帧 同步的,第三帧出错 然后就开始误差了

这个问题已解决,bug不存在.
但是我也说明下我产生这个问题的原因.

1.为了减少查看日志的内容我没有完整打印rect 只打印了坐标. 然后误以为操作同一个node size应该是固定的.
2.然后我今天打印完整日志后发现 发生错误的时候size是变化的.
3.我检察预制体发现图片的sizemode设置的是trimmed的 去掉了透明像素.并且有执行动画 并且动画每一帧的像素大小是不一样的. 所以导致了getBoundingBox 的size有差别
4.原本就算getBoundingBox 的size会每帧变化 为什么不同浏览器会有不动表现?因为 动画播放时根据客户端的帧率来播放的.但是帧同步是根据网络帧去算的. 例如两边客户端都在执行第5帧 A浏览器播放第一帧动画size是3232 但是这个时候b浏览器可能在播放第二帧动画2828 所以导致了两边在执行getBoundingBox的时候坐标不一致.

建议:如果不需要考虑透明内容 不要用trimmed 或者 动画trimmed后大小一致 或者用网络帧来控制动画播放 都能避免这种问题.

2赞