安卓平台上,帧动画发生不规则抖动

如果仅仅调试用是可以的,正式游戏内就肯定不行了。或者如果你方便的话,我也可以把碎图发给你,你自己调整下打包设置或颜色什么的?

只是测试。
没事,我自己用软件修改了。

辛苦了,碎图已经私信你了,希望能帮上忙。

通过测试发现是精度问题,纹理坐标从CPU传到GPU后,因为精度问题带来四舍五入导致了纹理坐标微小变化。通过修改shader的精度还无法解决。我再看看还有什么别的办法。

通过修改精度解决了,具体的修改地方如下

precision lowp float;

改成

precision highp float;
varying mediump vec2 v_texCoord;

改成

varying highp vec2 v_texCoord;

这样修改后会对所有的sprite都起效,性能可能会有影响,具体你要测试一下。另外我觉得还有解决方法就是
自己写shader,修改精度,只针对有问题的图片使用这个shader。

我依照着修改了代码重新编译,然而发现并没有改善,安卓上还是一样的抖。你可以尝试换个帧动画来播放(我传给你的碎图中有很多帧动画可选),估计很快就会发现还有问题。
从我自己之前的测试来看,这抖动和错位和图片本身的样子没有关系;相同的图片资源用不同的设置(比如padding之类的)来打包,运行时抖动和错位的形式也有点不一样。
我基本无法针对有问题的图片写shader,因为出问题的图片是不确定的,换个姿势打包,或者新增碎图,就会发生变化。更恶心的是,根据玩家反馈,相同的游戏版本在不同安卓设备跑起来的抖动和错位情况也略有不同,也就是说即使我能写shader,在原先正常的设备跑就可能会导致抖动。
另外我个人觉得这可能不完全是精度的问题,毕竟抖动的幅度很大,float和double的精度差别应该没有大到这种程度。

我在iPhone6的测试修改精度后就不会抖动了。而且从通过Xcode抓数据来看纹理坐标确实变了(和CPU得到的数据对比)。精度的影响就是和图片的位置相关的,因为图片被打包后的位置不同,它的纹理坐标就改变了。

另外,我是从你给的2048*2048的那个例子通过修改精度后没问题了。你是用哪个测试例子测试?你测试的机器是什么?

另外,我没有收到你发给我的碎图,你发到哪里了?

碎图在这: http://forum.cocos.com/t/topic/41093 抱歉不太会用私信(可能这不是私信:joy:
我是在安卓上测试的,打包大小是40962048(我游戏图片资源多,必须超出20482048,否则draw call会爆炸),机器是先锋G71,安卓4.x。

看到你的碎图了。不过我自己去拼装碎图然后播放动画比较麻烦而且可能和你测试的情况不一样。你能否直接给我可用的plist和对应的图片?就像之前传的那样。

另外,只有这个机器能够重现吗?还有别的设备会出现吗?我不确定是否能找到这个设备。

额……我又测试了一下,刚刚所说的仍然抖动的是用的游戏中实际使用的40601394的合图,然后我改成了2的倍数的40962048后,抖动终于消失了。非常感谢!
根据玩家以前的反馈(没有按上面说的修改精度),这个抖动的情况在不同的安卓机上都会出现,但我没有详细问他们是什么机器。

我这边确认了非2的倍数下,即使修改了精度,动画仍然会抖,如果你方便的话可以再找找原因……资源已经上传了:)

好的,我看看能否找到问题。

麻烦把资源上传一下吧。

已经传了,在这里 http://forum.cocos.com/t/topic/41093

好的。奇怪,私信我没收到通知。

:joy: 祝顺利!
另,个人觉得也许可以考虑把这个问题的修复合进引擎代码里,毕竟被这个问题坑过的明显不止我一个人……

修改精度会对引擎的效率影响比较大。从我测试发现,这里的纹理坐标只是因为四舍五入带来了0.001的变化,一般的图片影响不会太大,所以不太适合合并进引擎的修改。

我在华为的p9上使用非2次幂的图片没看到抖动。

哦哦,我这里先锋g71,安卓4.x是确定了会抖的,不过使用2次幂不会抖,暂时也能够应付过去了。再次感谢,如果后续有玩家设备上出现了抖动我再来骚扰:slightly_smiling:

明大, 我们最近也发现了这个问题, 使用碎图时是没有问题的, 一旦使用TP打包, 并且设置为 NPOT 之后, 动画播放就会发生抖动. 修改为 POT 之后打包就没有问题了, 但是如果所有的打包都开启 POT 的话, 估计内存压力会大很多呀.