【问题标题】:How to smoothly animate a sprite with a large texture sequence?如何平滑地为具有大纹理序列的精灵设置动画?
【发布时间】:2014-01-21 06:44:56
【问题描述】:

我创建了一个 SKSpriteNode 作为我场景中的唯一节点。它展示了一只 120 x 75 像素的小乌龟在跳舞。

乌龟有 100 个舞格。我可以在 Finder 中逐步浏览帧并看到完美的平滑动作。

现在我在 Sprite Kit 中做了可笑的简单测试。纹理图集上的所有帧。在应用程序启动时,我生成 SKTextureAtlas 对象,然后将所有 SKTexture 对象预加载到序列数组中。在每一帧上,我在海龟节点上调用 -next。然后它简单地从数组中抓取下一个 SKTexture 并将其设置为当前纹理。

动画不流畅。 iPhone 5S 说 60 帧/秒。但我看到会发生随机丢帧。

我尝试使用 PVR 进行压缩。然后我尝试不使用地图集。还尝试调用 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 帧渲染时间也会发生很大变化?

【问题讨论】:

  • 您是否设法使用 PVR 而没有 atlas 进行压缩?如果是这样,你能指点我一些文档吗?

标签: ios iphone sprite-kit


【解决方案1】:

你为什么不直接使用 SKAction 方法:

+ (SKAction *)animateWithTextures:(NSArray *)textures timePerFrame:(NSTimeInterval)sec

并让框架在您需要的所需时间/帧速率上执行此操作。 link to documentation

【讨论】:

  • 为什么投反对票?如果要使用更新方法手动更改纹理,则必须携带时间参考,以确保如果帧速率更改几帧,则不会领先或落后。在正确的时间显示帧比确保它们都显示更重要。如果因为你的 fps 下降而需要跳过一个,那就更好了。在任何一种情况下,您仍然会显示一个太长时间,但至少整体运动将与预期保持一致。 animateWithTextures 会自动为您执行此操作。很好的答案。
【解决方案2】:

可能而且永远会有小问题。假设您的情况是完美优化和/或简单化的测试,这些仍然可能发生。毕竟 iOS 是一个多任务操作系统,运行后台进程,不时消耗一些 CPU 时间。包括在后台运行的 App Store 应用。

如果设备长时间使用而未重新启动(关闭并重新打开),则可能会出现 iOS 设备上的常见问题。有时这可以消除持续的延迟。

因此,如果您遇到此类问题,首先要做的就是重新启动您的设备。

您还应该在 SKView 中启用showsDrawCountshowsNodeCountshowsFPS 以查看这些值是否合理。您会希望尽可能减少抽奖次数。

如果您有 100 个精灵和大约 100 个绘制调用,Sprite Kit 无法批量绘制您的精灵,这是一个问题。如果精灵不是从同一个图集创建的,并且它们之间没有其他子节点,则可能会发生这种情况。

请注意,FPS 是平均值,即使出现问题也可能不会显示任何变化。

【讨论】:

  • “在它们之间没有其他子节点的顺序”是指它们在显示列表中的位置吗?
  • 非常感谢您提供关于批量抽奖序列的信息,解决了我在其中一个游戏中遇到的问题。
猜你喜欢
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
  • 2010-11-10
  • 2012-12-03
  • 2016-05-13
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多