预加载场景以防止延迟?

时间:2016-05-02 20:07:00

标签: swift sprite-kit

大家好我已经制作了我的游戏的第一级,但总是当我从主菜单屏幕进入第一级时,屏幕冻结了2秒钟,从主屏幕到游戏的过渡非常延迟迟滞,有时甚至不会出现。有没有办法在后台预加载场景以防止滞后?

2 个答案:

答案 0 :(得分:1)

您可以在不同的线程中加载场景的资源。我在我的游戏中这样做,以获得真正快速的场景转换,尽管事实上我加载了大量的资源。

在场景类中制作静态函数以预加载场景

class func createResources(withCompletion: (scene: BaseScene) -> ()){

    // load resources on other thread
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), {

        let scene = YourScene()

        // callback on main thread
        dispatch_async(dispatch_get_main_queue(), {
            // Call the completion handler back on the main queue.
            withCompletion(scene: scene)
        });
    })

}

称之为

    YourScene.createResources(withCompletion: {
        [weak self]
        scene in

        self!.skView.presentScene(scene)
    })

所以使用它的方法是在不同的线程上预先构建你的场景。因为它在不同的线程上运行你不应该得到那个尴尬的停顿。

例如,

。让我们说玩家达到击败关卡的目标。在我使用这种方法之前,游戏会在加载下一个场景之前暂停一秒钟。

当玩家现在击败关卡时,我仍允许他们四处移动直到下一个场景加载,然后玩家将立即进入下一关卡创建即时过渡。

当船舶在各级之间超调时,你可以在这里看到它。有很多资源加载但转换是无缝的。 https://www.youtube.com/watch?v=u_bXA3woOmo

答案 1 :(得分:0)

@hamobi答案的Swift 5版本

文件: DispatchQueueExtensions.swift

import Foundation

extension DispatchQueue {

    static func background(_ task: @escaping () -> Void) {
        DispatchQueue.global(qos: .background).async {
            task()
        }
    }

    static func main(_ task: @escaping () -> Void) {
        DispatchQueue.main.async {
            task()
        }
    }
}

文件: GameScene.swift

extension GameScene {
    class func create(completion: @escaping (_ scene: GameScene) -> Void) {        
        DispatchQueue.background {
            let scene = GameScene()
            DispatchQueue.main {
               completion(scene)
            }
        }
    }
}

用法:

GameScene.create(completion: { [weak self] scene in

            let transition = SKTransition.doorway(withDuration: 1.0)
            self?.view?.presentScene(scene, transition: transition)
})