Sprite kit精灵加载性能提升

Tru*_*iTr 5 ios sprite-kit swift

我正在制作精灵工具包游戏,我正在使用plist文件来设置每个级别的属性.我的plist文件中的一个属性是一个名为patterns的字典,它包含n个项目,其中每个项目都是一个块,带有手动键入的x和y位置.这个模型对于我正在制作的游戏来说非常合适,因为以快速的方式设置关卡非常方便.然而,由于缺乏编码经验,我面临一个我无法解决的缺点:一些级别有多达290个块,所以当应用程序尝试读取级别时,应用程序会冻结5秒钟.这对用户来说非常烦人.在开始时我的方法是:读取plist文件,并为每个项目调用使用其imageNamed""方法创建块作为SKSpriteNode的方法.我认为这就是它落后的原因,我试图在运行时加载300个精灵的事实似乎是这个问题的一个有希望的原因.然后我尝试了以下内容:当游戏第一次启动时,我创建了最初加载块池的方法.这是我的方法

    func addObsticles1ToPool() {

    for i in 0...300 {

       let element = SKSpriteNode(imageNamed: "obsticle1")
       element.hidden = true
       obsticle1Pool.append(element)

    }

}
Run Code Online (Sandbox Code Playgroud)

然后,我的代码读取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. 
Run Code Online (Sandbox Code Playgroud)

我也有方法处理这样一个事实:新的元素应该作为游戏的收益添加到池中,所有这些都可以正常工作.延迟时间下降到3.5到4秒左右,但这显然还不够好.我希望有一个没有滞后的游戏.但是,我不确定是否有另一种更有效的方法来做我想要做的事情而不是使用精灵池.有谁知道如何减少这个滞后时间?

Sky*_*ren 6

我曾经有过同样的问题!问题出在这一行......

let element = SKSpriteNode(imageNamed: "obsticle1")
Run Code Online (Sandbox Code Playgroud)

SpriteKit不够聪明,不知道已经使用该图像创建了纹理.所以它正在做的是一遍又一遍地创建纹理,这是昂贵的.

而是首先在循环外部创建纹理,然后使用纹理创建精灵节点.像这样......

let elementTexture = SKTexture(imageNamed: "objstical1")

for i in 0...300 {

    let element = SKSpriteNode(texture: elementTexture)
    element.hidden = true
    obsticle1Pool.append(element)

}
Run Code Online (Sandbox Code Playgroud)

这不仅会快一点,它会减少你的应用程序内存...假设它是我遇到的同样问题.希望这会有所帮助.