Sprite kit 精灵加载性能改进

Sprite kit sprites loading performance improvement

我正在制作一个 sprite 套件游戏,我正在使用 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)

    }

}

然后,我的代码读取 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 秒左右,但显然仍然不够好。我想要一款没有延迟的游戏。但是,我不确定是否有另一种比使用精灵池更有效的方法来做我想做的事情。 有谁知道如何减少这个滞后时间?

我也遇到过同样的问题!问题出在这一行...

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)

}

这不仅会快很多,还会大量减少您的应用程序内存...假设这与我遇到的问题相同。希望对您有所帮助。