创建新的 SKSpriteNode 与使用 SKSpriteNode 的副本
Posted
技术标签:
【中文标题】创建新的 SKSpriteNode 与使用 SKSpriteNode 的副本【英文标题】:creating new SKSpriteNode vs using a copy of a SKSpriteNode 【发布时间】:2018-07-17 16:00:29 【问题描述】:我正在寻找提高游戏性能的方法。在我的游戏中,boss 会同时(不同角度)施放 16 个火球。我当前的代码是为每个火球创建一个 SKSpriteNode,并重复该过程 16 次。我可以通过将创建过程分派到不同的线程来提高性能,然后在创建精灵后将其添加回主线程。这样我就不会在游戏中看到明显的滞后。 但是,我认为如果我在创建第一个火球精灵后缓存它,然后使用 .copy() 15 次来创建其余的火球,它会进一步提高性能吗? 最终,我试图理解在 SKSpriteNode 上使用 .copy() 与创建新节点一样昂贵?
感谢您的任何见解。
【问题讨论】:
【参考方案1】:复制稍微便宜一点,但也不贵。它不需要访问任何 IO 来抓取纹理之类的东西,因为您已经在内存中拥有它。
现在,按照您设计游戏的方式,您不应该不断地重新创建火球。您应该创建一个池,并不断回收它们。这样,您只需在游戏的加载部分创建一次,就不会在多余的工作上浪费宝贵的周期。
【讨论】:
感谢您的建议。我听说过对象池的概念,但不知道如何实现它。首先,如果 Boss 一次施放 16 个火球并且在他死前可能施放 30 次,那就是 16 * 30 = 480 个火球。那么我需要在加载阶段创建 500 个火球吗?很抱歉这个愚蠢的假设,因为我不知道对象池是如何工作的。你能告诉我它是如何实现的吗?非常感谢。 boss施放3轮火球,每轮由16个火球组成,每轮之间有0.3秒的停顿。所以屏幕上一次至少有 32 个火球。 那么你的池子里至少需要 32 个火球。你制作了一组 32 个火球,当你需要它时,将其从组中移除,当火球完成后,将其放回组中。 然后您可以进行一些高级处理,例如,如果您的池低于 10%,请使用后台线程将更多火球添加到池中以增加可用数量。 太棒了!感谢您的指点。但是,我只是好奇使用对象池可以提高多少性能,因为我需要不断地用 32 个火球补充池,而不是在需要时创建 16 个火球,两者都在后台线程中完成?以上是关于创建新的 SKSpriteNode 与使用 SKSpriteNode 的副本的主要内容,如果未能解决你的问题,请参考以下文章
创建新的 SKSpriteNode 与使用 SKSpriteNode 的副本
SKSpriteNode 在 init(NSCoder) 中设置颜色