SpriteKit SKSpriteNodes 管理

Posted

技术标签:

【中文标题】SpriteKit SKSpriteNodes 管理【英文标题】:SpriteKit SKSpriteNodes management 【发布时间】:2014-02-20 16:18:29 【问题描述】:

我有一个游戏,我需要在屏幕上呈现具有从右到左飞行路径的敌人 (SKSpriteNodes)。我目前把它做成苹果的冒险游戏,有两个数组:一个是活跃的敌人,一个是不活跃的;两者的容量都是 10。当游戏需要添加一个敌人(通过 update 方法)时,它会从 inactive 数组 中取出一个,将其作为子元素添加并放入它在活动数组中。当敌人完成它沿着屏幕的路径或当它被摧毁时,我从 active 数组 中取出它,将它从它的父级中移除,并将它放在 inactive 数组的索引 0。

代码:

添加敌人:

enemySN = [_asteroidsInactiveMArray lastObject];
[enemySN removeFromParent];
[_asteroidsInactiveMArray removeLastObject];
[_asteroidsActiveMArray addObject:enemySN];
[self addChild:enemySN];

消灭敌人:

[enemySN died];
[_aliensActiveMArray removeObject:enemySN];
[_aliensInactiveMArray insertObject:enemySN atIndex:0];

我担心的是:目前,10个敌人对于当前的设置来说已经足够了,但是如果我想增加屏幕上添加的敌人,10个就不够了。

我应该保持这种风格并在我没有剩余的时候尝试修改数组的大小吗?我应该采取另一种方法并停止使用数组并在需要时初始化敌人吗?

【问题讨论】:

您的问题似乎是您可以使用多大的精灵池,或者您是否应该使用精灵池。这取决于您的游戏,这不是某人能够为您回答的问题。制作你的游戏,并处理出现的问题。如果您想在实际遇到该主题之前了解更多有关此主题的信息,您可以谷歌和/或阅读此en.wikipedia.org/wiki/Object_pool_pattern 感谢您的链接。正如其中所述,在某些情况下,简单的对象池(不保存外部资源,但只占用内存)可能效率不高,并且可能会降低性能。。好吧,我认为这里不是这种情况。这些是 SKSpriteNode 的自定义类,它们使用图像加载、物理并在构造函数中初始化不同的对象。所以,至少现在,我会这样。 我认为这里接受的答案是 100%,您正在着手进行过早的优化。但是,学习池化以及它适用和不适用的情况并没有错,所以你知道。 【参考方案1】:

这是Premature Optimization 的情况。

你甚至不知道你的问题可能是什么 - 可能是内存使用,可能是搜索数组、添加/删除元素所花费的时间,这不可能是任何问题在你遇到填充率限制之前,这会阻止你在你的算法甚至变得有点低效之前在屏幕上绘制更多的敌人。

您甚至可能会发现您当前的方法比重新创建精灵要慢,因此您更改了它。但随后这种新方法成为一个重要问题,因为它也没有扩大规模。您只能通过测试和测量来发现,但同样:过早的优化。

解决您实际遇到的问题;不要追逐“也许”。

NSMutableArray 的大小不像 C 数组那样固定。如果您向其中添加更多项目,NSMutableArray 将动态增长,并在您删除项目时相应缩小。

【讨论】:

哇,那个网站太棒了!感谢您的建议。从现在开始,我将改变我对解决代码问题的看法。

以上是关于SpriteKit SKSpriteNodes 管理的主要内容,如果未能解决你的问题,请参考以下文章

SpriteKit 和 Swift 中 SKSpriteNodes 的 setScale 和 size 有啥区别?

SpriteKit SKSpriteNodes 管理

SpriteKit:SKSpriteNode 包含另一个 SKSpriteNodes 但只有一个 SKPhysicsBody

Sprite Kit:屏幕上的 SKSpriteNodes 计数

Swift SpriteKit SKSpriteNode 的“有时”不显示

如何检测 SKSpriteNode 和 SKView SpriteKit 之间的冲突