在 SpriteKit 中预加载纹理

Preloading textures in SpriteKit

我做了一些研究,但似乎找不到任何内容可以清楚地解释如何在动画中预加载单个纹理和纹理。我目前在 Assets.xcassets 中使用 Atlas 来对相关的动画图像进行分组。将我的图片放在 Atlas 中是否意味着它们已预加载?至于单个图像,像这样在 GameScene 之前声明纹理是否有意义:let laserImage = SKTexture(imageNamed: "Sprites/laser.jpg") 然后(例如)在我的一个 SKSpriteNode 子类中我可以通过 laserImage

我最终想知道是否有明确定义的方法来解决这个问题,或者我是否应该在 GameScene 之前将每个纹理存储为常量。任何关于正确(和最有效)方法的建议都会很棒。

一个单一的纹理图集

将您的所有资产放入一个 Sprite Atlas 中。如果不合适,至少尝试将单个场景的所有资产放入单个 Sprite Atlas

正在预加载

如果需要,可以使用此代码在内存中预加载纹理图集

SKTextureAtlas(named: "YourTextureAtlasName").preloadWithCompletionHandler { 
    // Now everything you put into the texture atlas has been loaded in memory
}

自动缓存

您不需要保存对纹理图集的引用,SpriteKit 有一个内部缓存系统。让它完成它的工作。

我应该使用哪个名称来引用我的图片?

忘记文件图像的名称,您为资产目录中的图像分配的名称是您唯一需要的名称。

如何将图像中的精灵创建到纹理图集中?

let texture = SKTextureAtlas(named:"croc").textureNamed("croc_walk01")
let croc = SKSpriteNode(texture: texture)

我尝试实现 appzYourLife 答案,但它增加了加载每个纹理的时间。所以我最终将所有最常用的 Sprites 放在一个图集中,并将其放在一个单例中。

class Assets {
    static let sharedInstance = Assets()
    let sprites = SKTextureAtlas(named: "Sprites")

    func preloadAssets() {
        sprites.preloadWithCompletionHandler {
            print("Sprites preloaded")
        }
    }
}

我在menuScene中调用了Assets.sharedInstance.preloadAssets()。并且:

let bg1Texture = Assets.sharedInstance.sprites.textureNamed("background1")
bg1 = SKSpriteNode(texture: bg1Texture)

引用已加载到内存中的纹理。