我创建了一个SKSpriteNode作为场景中的唯一节点。它展示了一个120 x 75像素的小型乌龟舞。
乌龟有100个舞蹈框架。我可以在Finder中逐步浏览帧并看到完美平滑的动作。
现在我在Sprite Kit中进行了荒谬的简单测试。纹理图集上的所有帧。在app启动时,我生成SKTextureAtlas对象,然后将所有SKTexture对象预加载到序列数组中。在每个帧上,我在乌龟节点上调用-next。然后它只是从数组中抓取下一个SKTexture并将其设置为当前纹理。
动画不流畅。 iPhone 5S说60 fps。但我发现随机帧丢失发生了。
我尝试用PVR压缩。然后我试了没有地图册。还尝试调用SKTextureAtlas的预加载方法。还是不顺利。它只是不会显示具有相同帧持续时间的所有纹理帧以获得平滑外观。
然后我做了更简单的测试。一个进度条,一次移动一个像素和100个纹理。还是不顺利。我的应用程序中没有其他任何内容,它是iPhone 5S。
更简单的测试:
SKAction *a = [SKAction moveByX:0 y:-300 duration:30];
[self runAction:a];
你会不时注意到跳跃或者跳跃。即使有这个非常简单的动画。也没有NSLog或控制台写入。从Mac断开设备时也是如此。
这是一个精灵套件限制,你不应该使用非常大的动画序列,因为Sprite Kit帧渲染时间甚至在60 fps时变化很大?
答案 0 :(得分:1)
可能并且将永远是小小的打嗝。假设在您的情况下进行了完美优化和/或简单的测试,这些测试仍然可以发生。毕竟iOS是一个多任务操作系统,运行后台进程时不时会消耗一些CPU时间。包括在后台运行的App Store应用程序。
如果设备长时间使用而没有重新启动(关闭再打开),则可能会出现iOS设备上的常见问题。有时这可以消除持续滞后。
因此,如果您发现此类问题,首先要做的就是重新启动设备。
您还应该在SKView showsDrawCount
,showsNodeCount
和showsFPS
中启用,以查看这些值是否合理。你想要尽可能低地保持抽奖计数。
如果你有100个精灵和大约100个绘图调用Sprite Kit无法批量绘制你的精灵,这是一个问题。如果精灵不是从相同的图集创建的,并且顺序中没有其他子节点,则会发生这种情况。
请注意,FPS是一个平均值,即使有打嗝,也不会显示任何变化。
答案 1 :(得分:0)
为什么不使用SKAction方法:
+ (SKAction *)animateWithTextures:(NSArray *)textures timePerFrame:(NSTimeInterval)sec
让框架在您需要的时间/帧速率下完成。 link to documentation