Grand Central Dispatch寻找不同的方法

时间:2016-01-29 20:35:46

标签: swift functional-programming sprite-kit ios9 grand-central-dispatch

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)
}

在我的游戏场景的辅助类中调用此方法。我正在关注TUT,是的,我尝试在当前项目中实现辅助类,我是编程新手。我也对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文件来处理音乐等。看起来这样我相信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。

1 个答案:

答案 0 :(得分:1)

为什么不在游戏场景中使用计时器来生成东西呢?或者甚至更好,您可以使用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)
    })
}