我创建了一个 SKSpriteNode 作为我场景中的唯一节点。它展示了一只 120 x 75 像素的小乌龟在跳舞。
乌龟有 100 个舞格。我可以在 Finder 中逐步浏览帧并看到完美的平滑 Action 。
现在我在 Sprite Kit 中做了可笑的简单测试。纹理图集上的所有帧。在应用程序启动时,我生成 SKTextureAtlas 对象,然后将所有 SKTexture 对象预加载到序列数组中。在每一帧上,我在海龟节点上调用 -next。然后它简单地从数组中抓取下一个 SKTexture 并将其设置为当前纹理。
动画不流畅。 iPhone 5S 说 60 帧/秒。但我看到会发生随机丢帧。
我尝试使用 PVR 进行压缩。然后我尝试不使用 map 集。还尝试调用 SKTextureAtlas 的 preload 方法。还是不流畅。它只是不会显示具有相同帧持续时间的所有纹理帧以获得平滑的外观。
然后我做了更简单的测试。一次移动一个像素和 100 个纹理的进度条。还是不流畅。我的应用程序中没有其他任何事情发生,它是 iPhone 5S。
更简单的测试:
SKAction *a = [SKAction moveByX:0 y:-300 duration:30];
[self runAction:a];
您会不时注意到跳跃或打嗝。即使有这个非常简单的动画。也没有 NSLog 或控制台写入。与 Mac 断开设备连接时也是如此。
这是 Sprite Kit 的限制,您不应该使用非常大的动画序列,因为即使在 60 fps 下,Sprite Kit 帧渲染时间也会发生很大变化?
Best Answer-推荐答案 strong>
可能而且永远会有小问题。假设您的情况是完美优化和/或简单化的测试,这些仍然可能发生。毕竟 iOS 是一个多任务操作系统,运行后台进程,不时消耗一些 CPU 时间。包括在后台运行的 App Store 应用。
如果设备长时间使用而未重新启动(关闭并重新打开),则可能会出现 iOS 设备上的常见问题。有时这可以消除持续的延迟。
因此,如果您遇到此类问题,首先要做的就是重新启动您的设备。
您还应该在SKView中启用showsDrawCount 、showsNodeCount 和showsFPS ,看看这些值是否合理。您会希望尽可能减少抽奖次数。
如果您有 100 个 Sprite 和大约 100 个绘制调用,Sprite Kit 无法批量绘制您的 Sprite ,这是一个问题。如果 Sprite 不是从同一个图集创建的,并且它们之间没有其他子节点,则可能会发生这种情况。
请注意,FPS 是平均值,即使出现问题也可能不会显示任何变化。
关于ios - 如何平滑地为具有大纹理序列的 Sprite 设置动画?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/20906331/
|