我正在制作一个精灵工具包游戏,并且正在使用plist文件设置每个级别的属性。我的plist文件中的一个属性是一个叫做pattern的字典,它包含n个项目,其中每个项目都是一个块,用手键入x和y位置。该模型对于我正在制作的游戏非常适合,因为快速设置等级非常方便。但是,由于缺乏编码经验,我面临一个无法解决的缺点:某些关卡有多达290个块,因此当该应用尝试读取关卡时,该应用冻结了5秒钟。这对于用户来说非常烦人。一开始我的方法是:读取plist文件,并为每个项目调用方法,该方法使用其imageNamed“”方法将块创建为SKSpriteNode。我认为这是它滞后的原因,我试图在运行时加载300个Sprite的事实似乎是问题的有希望的原因。然后,我尝试了以下方法:我制作了一种方法,该方法在游戏首次启动时首先加载一个块池。这是我的方法
func addObsticles1ToPool() { for i in 0...300 { let element = SKSpriteNode(imageNamed: "obsticle1") element.hidden = true obsticle1Pool.append(element) } }
然后,我的代码读取plist文件,并为每个块调用以下代码:
func block(x: CGFloat, y: CGFloat, movingUp: Bool, movingSide: Bool, spin: Bool, type: Int16) { var block: SKSpriteNode! for obs in obsticle1Pool { if obs.hidden { block = obs break } } block.hidden = false // Further down the properties of the block are set, such as actions it should perform depending on the input values, also its physics body is set.
我也有一些方法可以处理这样的事实,即随着游戏的进行,应该将新元素添加到池中,并且一切正常。滞后时间降至3.5-4秒左右,但这显然还不够好。我想要一款没有延迟的游戏。但是,我不确定是否有比使用Sprites池更有效的方法来执行我要执行的操作。有谁知道如何减少这种滞后时间?
我曾经有过同样的问题!问题在这一行…
let element = SKSpriteNode(imageNamed: "obsticle1")
SpriteKit不够聪明,无法知道已经使用该图像创建了纹理。因此,它要做的是一次又一次地创建该纹理,这很昂贵。
取而代之的是先在循环外部创建一个纹理,然后再创建一个带有纹理的精灵节点。像这样
let elementTexture = SKTexture(imageNamed: "objstical1") for i in 0...300 { let element = SKSpriteNode(texture: elementTexture) element.hidden = true obsticle1Pool.append(element) }
这不仅会快一吨,还会减少您的应用内存一吨……假设这与我遇到的问题相同。希望有帮助。