Sprite 套件精灵加载性能改进

Posted

技术标签:

【中文标题】Sprite 套件精灵加载性能改进【英文标题】:Sprite kit sprites loading performance improvement 【发布时间】:2015-05-24 20:53:46 【问题描述】:

我正在制作一个精灵套件游戏,我正在使用 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 秒左右,但这显然还不够好。我想要一个没有延迟的游戏。但是,我不确定是否有另一种更有效的方法来做我想做的事情,而不是使用精灵池。 有谁知道如何减少这个延迟时间?

【问题讨论】:

添加加载画面? 简单的解决方案,但这不在我的 UI 设计要求中:/ 你预加载了你所有的图片吗? U 将耗尽所有系统 RAM,尝试在开始时加载 300 个图像。操作系统将在具有这种使用模式的真实手机上杀死您的应用程序。此外,还有一个启动计时器,可以查看您的应用程序启动多长时间,如果启动时间过长,它将被终止。总体而言,您需要一种更好的方法,以便不需要加载太多图像或不那么大的尺寸。 【参考方案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)


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

【讨论】:

谢谢,确实有帮助!

以上是关于Sprite 套件精灵加载性能改进的主要内容,如果未能解决你的问题,请参考以下文章

限制 Sprite 套件帧率

Sprite Kit,使多个精灵遵循相同的方法

加载精灵的所有子精灵

使用资产管理器 LibGDX 加载精灵

使用资产管理器 LibGDX 加载精灵

Libgdx之Sprite 精灵类