问题描述
Color 类通过 _val(number 类型)存储 RGBA 数据(ABGR) 的顺序),每次对 RGBA 的修改都需要进行位移操作拼接出正确的数据。增加不必要的运算且容易出错。
当修复 Tween 接口时,无法通过通用的方式去修改 Color 值,需要进行 hack 操作来修复:https://github.com/cocos/cocos-engine/pull/16977。
我猜想最开始的设计是为了节省内存空间,每个 Color 可以节省 3 个 number,因为 number 比较小,用 32 位存储,所以大概可以节省 12 个字节。但是相对于逻辑的复杂和不统一,这点内存我觉得是没必要省的。
我看了 three.js 和 babylon.js 也都是直接存储 r, g, b, a 的值。
解决方案
Color 直接存储 r、g、b、a,移除 _val。这样定义很清晰,没有隐晦的格式。
受影响范围
对于直接使用 Color._val 数据的人会受影响。理论上,上层代码不应该直接使用这个数据,因为它是 ARGB 的格式,上层要使用的话还得自己分离出各颜色通道数据。要修改的话,还得知道这个顺序,而且需要进行正确的位移操作。
另外,这个属性在 3.5 就已经 deprecated 了。


,现在我都忘了当时是怎么解决的了。。。