2011-09-15 4 views
2

SoundPool을 사용하는 동안 성능 문제가 있습니다. 사운드를 재생할 때마다 프레임 속도가 떨어집니다. 일부 로그를 추가하고 logcat에서 "재생"기능이 8ms 가량 소요될 수 있음을 알 수 있습니다.게임에서 SoundPool을 올바르게 사용하는 방법은 무엇입니까?

나는 *에는 OGG 파일을 사용하고 있습니다와 SoundPool 초기화는 응용 프로그램 시작시 수행됩니다

mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
mSoundPool = new SoundPool(size, AudioManager.STREAM_MUSIC, 0); 
mSoundPoolMap = new HashMap<Integer, Integer>(); 
mSoundPoolMap.put(index, mSoundPool.load(context, R.raw.shot, 1)); 

내가 (게임 루프 내에서) 다음 코드를 사용하여 사운드를 재생하려면 :

mSoundPool.play(id, streamVolume, streamVolume, 1, loop, 1f); 

내 질문은 :

  • 나는 게임 루프 이외의 다른 스레드에서 "놀이"를 부를까요?
  • 서비스를 통해 "재생"이라고해야합니까?
  • 내가 잘못하고 있니?

감사합니다.


업데이트 : 난 그냥 다른 스레드의 사운드를 재생하고, 서비스를 통해 소리를 재생 테스트,하지만 지연이 여전히 존재

.

은 그 때 나는 다음 테스트를했다 : * 1000MS 간격의 소리를 재생 -> 지연은 항상 200 밀리 초 간격의 사운드를 재생 * 을 발생 -> 지연이 결코

발생하지 어떻게하는 것이 가능할까요?!? !? 이 테스트가 끝나면 아무 것도 연주하지 않을 때 SoundPool이 재설정되고 다시 재생할 때 초기화하는 데 시간이 오래 걸릴 것 같습니다. 매우 이상합니다!

답변

5

나는 루프에서 음소거 사운드를 재생하여 문제를 해결 : 지체가 완전히 사라

mSoundPool.play(id, 0, 0, 1, -1, 1f); 

!

이렇게하는 것이 옳은 것처럼 보이지 않으므로 누구나 설명 할 수있는 방법을 알고 있으면 알려 주시기 바랍니다.

더 많은 정보 : http://www.thiagorosa.com.br/en/how-to/improve-soundpool-performance

+0

이상하지만 작동하지 않습니다. 감사! –

+0

이것은 배터리 수명에 어떤 영향을 줍니까? – Phil

+0

특정 주파수에서 사운드를 재생할 때 비슷한 지연 문제가 있습니다. 그러나 나는 해결책을 얻지 못한다. 음소거 된 경우 왜 연주해야합니까? 나는 다른 어떤 소리도들을 수 없었다. –

0

게임 루프 외부의 다른 스레드에서 "재생"이라고해야합니까?

서비스를 통해 "재생"해야합니까?

두 가지 모두 시도해 보았습니다. 둘 다 동일한 성능 향상을 제공하는 것으로 보입니다. 두 응용 프로그램 모두 눈에 띄는 지연을 수정했습니다. 그래서 나는 그 중 하나를 골라라. 그러면 그것은 당신의 성과를 도울 것입니다.

+0

방금 ​​두 가지 방법을 모두 시도했지만 성능이 향상되지 않았습니다. 나는 http://stackoverflow.com/questions/5580537/androidsound-pool-and-service에서 서비스 아이디어를 사용했고 나 자신이 만든 스레드 솔루션을 사용했다. – thiagolr

1

당신은 MP3 파일 대신 OGGs을로드 할 수있다, 나는 일부 휴대 전화에 OGGs 그냥 잘 작동하지 않는 것을 발견했다.

+3

나는 실제로 그 반대라고 말할 것입니다. – Ricky

1

필자는 별도의 그리기 및 게임 루프를 사용하고 있으며 사운드 풀 재생을 호출하면 드로잉 루프가 약간의 지연을 경험합니다.항상 그런 것은 아니지만 내 앱이 뒤쳐진 것처럼 보입니다.

나는 wav와 ogg를 모두 시도했지만 많은 차이점이있는 것으로 보입니다. Wav가 조금 나아졌지만 다른 문제가 발생합니다. 한 번만 호출하면 사운드 풀에서 wav 파일을 두 번 재생하기 때문에 ogg로 전환했습니다.

나의 현재 솔루션에서 플레이를 호출하는 새로운 실행 가능으로 : 내 게임 루프에서 다음

public class MyRunnable implements Runnable { 
     private int s_id; 
     public MyRunnable(int sound_id) { 
      s_id = sound_id; 
     } 
     public void run() { 
      SoundManager.playSound(s_id, 1); 
     } 
} 

하고, 나는

Runnable r = new MyRunnable(sound_id); 
handler.postDelayed(r, 0); 

내가 이런 식으로 훨씬 적은 지연을 경험 부르지 만, 나는 올바른/최선의 해결책이 아닌 것은 확실합니다.

0

방금 ​​백그라운드에서 침묵을 반복하는 thiagolr의 기법과 비슷한 것을 구현했습니다. 나는 그것이 문제를 "고치는"옳은 방법처럼 보이지 않는다는 것에 동의한다 - 그러나 그것은 효과적이다. MediaPlayer를 사용하여 배경 "사운드"를 반복했습니다. SoundPool에서 스트림을 사용하면 실제 사운드 효과를 재생하기 위해 다시 사용되기 때문에 문제가 다시 발생했기 때문입니다.

내가 도움이 된 또 다른 사항은 모든 오디오를 16 비트 22K 오그로 변환하는 것이 었습니다.

백그라운드에서 반복되는 침묵의 가장 큰 단점은 작은 배터리로 인한 피해이지만 가정 할 때 사운드 효과를 재생하는 것이 가치가 있다고 생각합니다. 진저 브레드 나 그 이하를 사용하는 기기에서만이 작업을 수행합니다. 그것은 킨들 파이어 (Kindle Fire)에서 멋지게 잘 작동하며, 나는 누크 태블릿에서 적절하게 잘 생각합니다. 내 응용 프로그램은 이미 눅 컬러의 느린쪽에 조금 있지만, 이것이 더 나쁜 것으로 생각하지 않습니다. 요즘에는 OpenGL을 사용하기 위해 드로잉 코드를 완전히 변환해야합니다.

0

OGG가 모든 플랫폼에 제공되는 동안 MP3는 거의 최선의 방법이므로 그 플랫폼은 지원하지 않을 수 있습니다.

관련 문제