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 でこのパフォーマンスの問題を修正する方法を知っている人はいますか?
また、サードパーティのライブラリ、つまり次のことにも注意しました。
- AudioKit [非常に重く見えます]
- ObjectAL [最終更新 2013 ...]
- AVAudioEngine [AVAudioPlayerベース、同じ問題?]
要件:
- 非常に短いサンプルをたくさん再生します (ショット、ヒットなど)。
- いくつかのモーター効果を再生します (したがって、ピッチングがいいでしょう)
- バックグラウンド/アンビエント サウンドをループで再生する
- 厄介なグリッチやフレーム レートの低下はありません。
私の要件に対して上記のライブラリのいずれかを推奨するか、上記のコードを使用して問題を指摘していただけますか?
アップデート:
短い音を鳴らす:
self.runAction(SKAction.playSoundFileNamed("sfx.caf", waitForCompletion: false))
確かにフレームレートが向上します。Audiacity を使用してオーディオ ファイルを .caf 形式 (Apple の Core Audio Format) にエクスポートしました。しかし、チュートリアルでは、" Signed 32-bit PCM
" エンコーディングでエクスポートするため、私の場合はオーディオの再生が乱れました。他のエンコーディング オプション ( 32-bit float
、U-Law
、A-Law
など) を使用しても問題なく動作しました。
caf
フォーマットを使用する理由 圧縮されていないため、 のような圧縮形式と比較して、CPU オーバーヘッドが少なく、メモリへの読み込みが高速m4a
です。短い間隔で何度も再生される短いサウンド エフェクトの場合、これは理にかなっています。数キロバイトを消費する短いオーディオ ファイルの場合、ディスクの使用量はあまり影響を受けません。アンビエント ミュージックやバックグラウンド ミュージックなどの大きなオーディオ ファイルの場合は、圧縮形式 ( mp3
、m4a
) を使用する方が明らかに優れています。