2016-07-20 2 views
2

나는 Sprite Kit를 사용하고 선호하게는 Swift 라이브러리를 사용하여 iOS 9+ 용 게임을 개발 중입니다.iOS : fps를 떨어 뜨리지 않고 오디오를 재생하는 방법은 무엇입니까?

현재 오디오 파일을 미리로드하고 각각 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() 

이 기본적으로 작동을하지만, 파일이 재생 및 프레임 속도는 60.0에서 56.0로 떨어질 때 나는 항상 글리치를 얻을 내 iPad Air에.

누군가가 AVAudioPlayer에서이 성능 문제를 해결하는 방법을 알고 있습니까?

는 또한, 즉, 제 3의 라이브러리를 위해 밖으로 보이는 :

  • AudioKit
  • ObjectAL [마지막 업데이트 2013 ...]
  • AVAudioEngine [AVAudioPlayer에 기초하여 매우 무거운 가중 같은데, 같은 문제]

요구 사항 :?

  • 어떤 운동 효과를 재생 (등, 안타 샷처럼) 매우 짧은 샘플을 많이 플레이
  • 루프에서 몇 가지 배경/주위 소리 재생 (따라서 좋은 것 투구)
  • 불쾌한 글리치/프레임 속도 저하!

내 요구 사항에 위의 라이브러리 중 하나를 사용 하시거나 위의 코드를 사용하여 문제를 지적 하시겠습니까?

UPDATE : 짧은 소리를 재생

:

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

실제로 프레임 속도를 향상 않습니다. I exported the audio files with Audiacity to the .caf format (Apple's Core Audio Format).하지만 튜토리얼에서는 "Signed 32-bit PCM"인코딩을 사용하여 내 케이스에서 오디오 재생을 방해합니다. 다른 인코딩 옵션 (32-bit float, U-Law, 등)을 사용하면 문제가 없습니다.

caf 형식을 사용하는 이유는 무엇입니까? 압축되지 않았기 때문에 m4a과 같은 압축 된 형식에 비해 CPU 오버 헤드가 적은 메모리에 더 빨리로드되기 때문입니다. 짧은 사운드 효과가 짧은 간격으로 많이 재생되는 경우 이는 의미가 있으며 몇 킬로바이트를 소비하는 짧은 오디오 파일의 경우 디스크 사용량에 큰 영향을주지 않습니다.앰비언트 및 배경 음악과 같이 더 큰 오디오 파일의 경우 압축 형식 (mp3, m4a)을 사용하는 것이 좋습니다.

var backgroundMusic: SKAudioNode! 

예를 들어 당신이 didMoveToView()이를 추가 할 수 있습니다 : 당신이 아이폰 OS 9+위한 게임을 개발하는 경우

+0

http://stackoverflow.com/questions/25646583/massive-fps-drops-when-avaudioplayer-ist-triggered-repeatedly-sprite-kit 도움이 될 수도 있습니다. – Konsy

+0

@ Konsy : 의견을 보내 주셔서 감사합니다. 나 자신에 의해 답변을 올렸으므로이 링크를 알지만 내 문제는 루핑으로 해결할 수 없다. 이것은 모터 나 로켓 추력과 같은 음향 효과에 좋지만 내 사운드 효과는 사용자가 발사 한 발사와 같은 정확한 패턴없이 반복적으로 재생됩니다 질문에 나열된 프레임 워크에 대한 추가 아이디어 및/또는 권장 사항은 무엇입니까? – salocinx

+0

Sprite Kit의 방법은 어떻습니까? 'SKAction.playSoundFileNamed'와 같습니다. 나는 자신을 테스트하지 않았지만 프레임 속도를 죽이지 않도록 최적화되어 있다고 가정합니다. 노력할만한 가치가있을 수 있습니다. – Moritz

답변

3

귀하의 질문에 따라, 당신은 새로운 아이폰 OS 9 라이브러리 SKAudioNode (official Apple doc)를 사용할 수 있습니다 :

if let musicURL = NSBundle.mainBundle().URLForResource("music", withExtension: "m4a") { 
    backgroundMusic = SKAudioNode(URL: musicURL) 
    addChild(backgroundMusic) 
} 

또한 간단한 효과를 재생할 수 있습니다 :

let beep = SKAudioNode(fileNamed: "beep.wav") 
beep.autoplayLooped = false 
self.addChild(beep) 

마지막으로, 볼륨 변경하려면 :

beep.runAction(SKAction.changeVolumeTo(0.4, duration: 0)) 

업데이트 :

난 당신이 귀하의 질문에 대한 AVAudioPlayerSKAction 말하기 업데이트가 참조. 나는 iOS8 + 호환 게임을 위해이 두 가지를 모두 테스트했습니다.

AVAudioPlayer, 나는 개인적으로 오래된 SKTAudio을 기반으로하는 나에게 익숙한 맞춤 라이브러리를 사용합니다.

나는 AVAudioPlayer 초기화에 대한 코드를보고, 내 코드는 내가 사용하기 때문에 다른 : 나는 fileTypeHint이 변화를 알고, 그래서 시도하고 테스트에 대해 저를 기입하지

@available(iOS 7.0, *) 
    public init(contentsOfURL url: NSURL, fileTypeHint utiString: String?) 

. 당신은 당신이 원하는 목적지

단점 코드에 대한 iOS8의 호환성을 보장 관리자를 사용하여 볼륨을 제어 할 수 있습니다 AVAudioPlayer에 기반 공유 인스턴스 오디오 관리자로 : 코드에 대한

장점 매번 당신은 소리를 내고 다른 소리를 내고 싶습니다. 특히 배경 음악을 시작한 경우에는 이전 소리가 나옵니다.

해결 방법은 무엇입니까? 이 작업을 수행 할 수 있도록이 SO post 문제없이 잘 작동하는 것 같다 AVFoundation에 따르면, 4 AVAudioPlayer 속성 instantiables 제한됩니다 :

  • 1) backgroundMusicPlayer : AVAudioPlayer!
  • 2) soundEffectPlayer1 : AVAudioPlayer!
  • 3) soundEffectPlayer2 : AVAudioPlayer!
  • 4) soundEffectPlayer3 : AVAudioPlayer! 점유되어있는 경우보고 3 soundEffect를 통해 전환하는 방법을 만들 수

:

if player.playing 

하고 다음 무료 플레이어를 사용합니다. 이 해결 방법을 사용하면 항상 배경 음악을 포함 해 사운드가 올바르게 재생됩니다.

+0

답변 해 주셔서 대단히 감사합니다. 이 접근법을 즉시 확인해보고 성능 문제가 발생하지 않고 요구 사항을 완전히 충족하는 경우 해결책으로 해결책을 확인합니다. – salocinx

+1

귀하의 답변을 해결책으로 확인하고 원래 질문을 업데이트했습니다. 감사. – salocinx

+0

좋아, 당신은 iOS 8+에서 게임이 작동하기 때문에 내가 채택한 것과 같은 선택을 할 수 있습니다. 곧 답변을 드리겠습니다. –

관련 문제