1
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的想法,我已閱讀文檔和知道它有那麼大的用途....Grand Central Dispatch尋找不同的方法

在我的遊戲場景它用在這裏:

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的人都遇到過這樣的問題: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

如果您使用GCD,則需要像所有多線程程序一樣正確處理併發。 GCD對長時間運行*獨立*計算最爲有用。對於遊戲來說這不是一個好的解決方案。 – molbdnilo

+0

謝謝。非常直截了當。 – upallnight

+0

如果我爲遊戲場景增加一些代碼,會有幫助嗎?同時我會看看你提供的信息。 – upallnight

回答

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

謝謝,在做了一些研究之後,您已經給出了執行此方法的不同方法。 – upallnight

+1

我沒有在模擬器上運行,因爲這篇文章現在已經老了,我想警告人們混合UIKIT元素和SpriteKit元素。我的問題是我使用UIKit進行轉換,使用手動方式和故事板來轉換場景。退後一步之後,我意識到儘管您使用視圖控制器(GVC),並且它可以具有UIKit元素(iAds,Game Center,import Social),但它更適合在SpriteKit中構建場景,就像GCD和遊戲I我正在用這兩種方法測試.... – upallnight

相關問題