一尘不染

Sprite Kit提升Sprite加载性能

swift

我正在制作一个精灵工具包游戏,并且正在使用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池更有效的方法来执行我要执行的操作。有谁知道如何减少这种滞后时间?


阅读 227

收藏
2020-07-07

共1个答案

一尘不染

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

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)

}

这不仅会快一吨,还会减少您的应用内存一吨……假设这与我遇到的问题相同。希望有帮助。

2020-07-07