3

Sprite Kit を使用し、できれば Swift ライブラリを使用して、iOS 9 以降のゲームを開発中です。

現在、オーディオファイルをプリロードするシングルトンを使用しており、それぞれが AVAudioPlayer の個別のインスタンスに接続されています。

アイデアを得るために切り取った短いコードを次に示します。

import SpriteKit
import AudioToolbox
import AVFoundation

class AudioEngine {

    static let sharedInstance = AudioEngine()

    internal var sfxPing: AVAudioPlayer

    private init() {

        self.sfxPing = AVAudioPlayer()

        if let path = NSBundle.mainBundle().pathForResource("ping", ofType: "m4a") {
            do {
                let url = NSURL(fileURLWithPath:path)
                sfxPing = try AVAudioPlayer(contentsOfURL: url)
                sfxPing.prepareToPlay()
            } catch {
                print("ERROR: Can't load ping.m4a audio file.")
            }
        }

    }

}

このシングルトンは、アプリの起動時に初期化されます。ゲームループでは、次の行を呼び出して特定のオーディオ ファイルを再生します。

AudioEngine.sharedInstance.sfxPing.play()

これは基本的に機能しますが、ファイルを再生すると、私の iPad Air でフレーム レートが 60.0 から 56.0 に低下すると、常に不具合が発生します。

AVAudioPlayer でこのパフォーマンスの問題を修正する方法を知っている人はいますか?

また、サードパーティのライブラリ、つまり次のことにも注意しました。

要件:

  • 非常に短いサンプルをたくさん再生します (ショット、ヒットなど)。
  • いくつかのモーター効果を再生します (したがって、ピッチングがいいでしょう)
  • バックグラウンド/アンビエント サウンドをループで再生する
  • 厄介なグリッチやフレーム レートの低下はありません。

私の要件に対して上記のライブラリのいずれかを推奨するか、上記のコードを使用して問題を指摘していただけますか?

アップデート:

短い音を鳴らす:

self.runAction(SKAction.playSoundFileNamed("sfx.caf", waitForCompletion: false))

確かにフレームレートが向上します。Audiacity を使用してオーディオ ファイルを .caf 形式 (Apple の Core Audio Format) にエクスポートしました。しかし、チュートリアルでは、" Signed 32-bit PCM" エンコーディングでエクスポートするため、私の場合はオーディオの再生が乱れました。他のエンコーディング オプション ( 32-bit floatU-LawA-Lawなど) を使用しても問題なく動作しました。

cafフォーマットを使用する理由 圧縮されていないため、 のような圧縮形式と比較して、CPU オーバーヘッドが少なく、メモリへの読み込みが高速m4aです。短い間隔で何度も再生される短いサウンド エフェクトの場合、これは理にかなっています。数キロバイトを消費する短いオーディオ ファイルの場合、ディスクの使用量はあまり影響を受けません。アンビエント ミュージックやバックグラウンド ミュージックなどの大きなオーディオ ファイルの場合は、圧縮形式 ( mp3m4a) を使用する方が明らかに優れています。

4

1 に答える 1