排查plist中offset字段导致的抖动问题
内容提要
最近遇到一个bug,plist制造的动画在creator中会颤动。排查发现是plist里的offset导致的。offset是trim通明像素前后,中心点的偏移。问题关键在于trimWidth-originWidth的结果是否能被2整除。使用TexturePacker来打包plist可以避免这个问题。测试例验证了creator能够正常处理offset为小数的情况。
延伸解读
问题根源:整数除法导致精度丢失
文章指出,plist中offset的计算公式为(trimWidth - originWidth)/2。当trimWidth与originWidth的差值无法被2整除时,结果会出现小数。若解析代码使用整数类型(如int)进行除法,小数部分会被直接丢弃,导致offset值不准确,进而引起动画抖动。因此,问题的关键在于trimDiff能否被2整除。
不同打包工具的差异与应对
测试发现,TexturePacker和CocosStudio打包同一图片时,宽度可能相差1像素。TexturePacker会将宽度53调整为54,使得trimDiff为偶数,从而避免小数offset;而CocosStudio则保留53,导致offset出现小数。文章建议尽量使用TexturePacker打包plist,以减少此类问题。
Cocos Creator 对小数 offset 的处理
作者通过测试例验证,Cocos Creator能够正常处理offset为小数的情况。在自动图集生成的配置中,offset值如-0.5、0.5等均被正确解析,动画未出现抖动。这表明Creator的解析逻辑支持浮点数,不会因小数offset而产生bug。
Q&A
plist中的offset是什么?
offset是trim透明像素前后的中心点偏移。
为什么plist动画在creator中会颤动?
因为plist里的offset导致的,关键在于trimWidth-originWidth的结果是否能被2整除。
如何避免plist中的offset问题?
使用TexturePacker打包plist可以避免offset导致的问题。
TexturePacker如何处理offset为小数的情况?
TexturePacker可能会自动调整尺寸以处理小数offset,确保解析功能正常。
Cocos Creator能否处理offset为小数的情况?
Cocos Creator能够正常处理offset为小数的情况,验证了结论的正确性。
不同软件打包plist时可能出现什么问题?
不同软件打包plist时,宽度可能出现偏差,根本原因是TrimDiff无法被2整除。