Grand Central Dispatch 寻找不同的方法

Grand Central Dispatch Looking for a different approach

func RunAfterDelay(delay: NSTimeInterval, block: dispatch_block_t) {
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC)))
    dispatch_after(time, dispatch_get_main_queue(), block)
}

在我的游戏场景的助手 class 中调用此方法。我正在关注一个 TUT,是的,我试图在当前项目中实现助手 class,我是编程新手。我也是 GCD 的新手,我已经阅读了文档并且知道它有如此大的用途....

在我的游戏场景中,这里使用的是:

RunAfterDelay(RandomDouble(min: minDelay, max: maxDelay)) { [unowned self] in
    self.createEnemy()

同样的场景也用在这里:

dispatch_async(dispatch_get_main_queue()) { [unowned self] in
    //   if(self.backgroundMusic.playing){

我找到了声音、BG 音乐和音效的解决方案,方法是创建一个全局 swift 文件,使用枚举、案例和 public 函数来处理音乐等。它看起来像这样我相信 Swift 的每个新手都对这个 运行 感兴趣:RW tuts

public class SKTAudio {
public var backgroundMusicPlayer: AVAudioPlayer?
public var soundEffectPlayer: AVAudioPlayer?

public class func sharedInstance() -> SKTAudio {
    return SKTAudioInstance

如果有更好的选择,我正在寻找一种不同的方法,因为它目前正在耗尽我的 CPU,经过几次运行后,它变得非常慢。那是一个不同的问题。我更关心寻找一种比列出的方法更好的方法。

这是一款利用 SpriteKit 和 UIKit 的游戏(出于 UI 原因)我放弃了它,现在我严格使用 SpriteKit。

为什么不在游戏场景中使用计时器来生成东西?或者更好的是,您可以使用 update 函数来执行这样的基于时间的游戏逻辑。这个答案有很好的解释:SpriteKit's Update Function: time vs. framerate

这些代码片段并没有真正说明您遇到 CPU 问题的原因。你 运行 在模拟器上吗?您也可以在另一个线程上尝试 运行 您的块。

func runAfterDelay(selector: Selector, object: AnyObject?, delay: NSTimeInterval) {
    let delay = delay * Double(NSEC_PER_SEC)
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
    dispatch_after(time, dispatch_get_main_queue(), {
        NSThread.detachNewThreadSelector(selector, toTarget:self, withObject: object)
    })
}