2016-06-26 6 views
0

私はAVAudioPlayerに問題があり、私のspritekitゲームで短い音を再生しています。私は非常にダイナミックなゲームシーンを持っています。ユーザーが特定の要素をタップすると、単純なビープ音を鳴らしたいのですが、AVAudioPlayerを使用してサウンドを実行すると、パフォーマンスに大きな問題が発生します。SpriteKitゲームのAVAudioPlayerとパフォーマンスの問題

私のオーディオファイルは、.mp3形式です。

また、私はSKActionメソッド(playSoundFileNamed)を実行してサウンドを実行しましたが、すべてがほぼ同じように見えますが、同じパフォーマンスの問題に気付きました。

私の質問は、SpriteKitでサウンドを実行するためのベストプラクティスです。

PS:WWDC Adventure spritekitのサンプルコードを見つけようとしましたが、サウンド再生に関する問題をどのように解決するかを確認しましたが、残念ながらサンプルコードは利用できません。

+0

おそらく、http://stackoverflow.com/questions/38031676/avaudioplayer-hiccups-the-app-sometimesの複製と私の答えはおそらくそれを解決するだろうが、私は自分自身dupehammerを適用することを躊躇している – matt

答えて

1

あなたのサウンドファイルをプリロードし、したがって、それらを再生する/作成する際に、いくつかのタイムラグ/遅延を取得していないので、あなたはおそらく遅れを取得しています。ベストプラクティスは通常、アプリの起動時にオーディオファイルをプリロードして、すぐに再生できるようにすることです。

AVPlayersの場合、アプリを起動するときだけでなく、再生する前にすべてを設定してください。あなたが単にAVPlayerを再生する音楽を再生したい時よりも。

myAVPlayer1.play() 

SKAction.play ...に関しては同じ問題です。あなたは、あなたのサウンドプロパティ

class GameScene: SKScene { 

    let sound1 = SKAction.playSoundFileNamed("Test", waitForCompletion: false) 

    .... 
} 

を作成して、正しい場所であなたのゲームに比べてあなたは

をそれを実行DidMoveToView上記ごgameSceneに直接ので

それを呼び出すのではなく、あなたのアクションへの参照を作成する必要があります

runAction(sound1) 

この方法では、サウンドが既にプリロードされているので、遅延がなくてはなりません。

ホープそれを使用する前に、プロセッサは、ファイルを解凍していない.WAVにあなたのオーディオファイルを変換する代わりに.MP3 することが好ましい、パフォーマンスについて

0

この操作を実行するのはです。 スプライトが他のアクションやコンテキストアニメーションに関与している場合は、スプライトをホストしているSKNodeからサウンドを起動できます。 最良の方法は、常に合理的なmp3ディメンションを使用することです..

P.S. :通常私はまた、音量を制御するには、この拡張機能を使用するためにpreefer:

public extension SKAction { 
    public class func playSoundFileNamed(fileName: String, atVolume: Float, waitForCompletion: Bool) -> SKAction { 

     let nameOnly = (fileName as NSString).stringByDeletingPathExtension 
     let fileExt = (fileName as NSString).pathExtension 

     let soundPath = NSBundle.mainBundle().URLForResource(nameOnly, withExtension: fileExt) 


     var player: AVAudioPlayer! = AVAudioPlayer() 
     do { player = try AVAudioPlayer(contentsOfURL: soundPath!, fileTypeHint: nil) } 
     catch let error as NSError { print(error.description) } 

     player.volume = atVolume 

     let playAction: SKAction = SKAction.runBlock {() -> Void in 
      player.play() 
     } 

     if(waitForCompletion){ 
      let waitAction = SKAction.waitForDuration(player.duration) 
      let groupAction: SKAction = SKAction.group([playAction, waitAction]) 
      return groupAction 
     } 

     return playAction 
    } 
} 
0

に役立ちます。

関連する問題