大家好我已经制作了我的游戏的第一级,但总是当我从主菜单屏幕进入第一级时,屏幕冻结了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)
})