2012-03-11 2 views
0

기본적으로 내 게임에서 두 항목이 충돌 할 때 재생되는 사운드 효과가 있습니다. 일부 항목은 서로 아주 가깝기 때문에 사운드 효과를 신속하게 연속 재생해야 할 수 있습니다.XNA SoundEffectInstance 자체 재생 허용

SoundEffect.Play()를 사용하면 효과가 있습니다. 그러나 가비지 수집을 저장하려면 인스턴스를 사용하고 싶습니다. 불행히도 마지막 인스턴스가 끝날 때까지 인스턴스가 재생되지 않음을 의미합니다. 이것은 내가 따라 간 효과가 아닙니다. 이 기능을 덮어 쓸 수있는 방법이 있습니까? 아니면 일반 SoundEffect로 돌아 가야합니까?

+0

가능한 중복 [하나의 인스턴스에서 소리 반복] (http://stackoverflow.com/questions/8994292/repeating-sound-from-one-instance) –

답변

1

왜 "가비지 수집에 저장 하시겠습니까?" 실제 성능 문제가 발생하지 않는 한 걱정할 필요가 없습니다. 개인적인 경험을 통해 어떤 문제없이 연속적으로 적어도 12 건의 사운드를 재생할 수 있습니다 (SoundEffect.Play() 사용). 그러나 게임에 충돌이 많다고 생각되면 다음 두 가지 작업을 수행 할 수 있습니다.

먼저 놀고있는 모든 소리를 처리하는 간단한 SoundPlayer 클래스를 만드는 것이 좋습니다. , 다음 재생을 방지합니다. 많은 충돌이 발생하면 플레이어가 누락 된 소리를 알아 차리는 것처럼 보이지 않습니다.

두 번째로, 을 사용하여 소리를 미리 믹싱하는 방법에 대해 살펴보십시오 (http://forums.create.msdn.com/forums/t/91165.aspx). 이것은 좀 더 복잡하지만, 앞으로 살펴보고 모든 사운드를 하나의 버퍼로 믹싱하면, 사운드 (또는 하나의 오디오 스트림 버퍼)가 효율적으로 존재하기 때문에 거의 지연을 보장 할 수 있습니다 연주.

+0

아, 만약 그것을 할 수있는 간단한 방법이 없다면 벌금. 내 게임에서 한 번에 10 개 이상의 충돌을 가질 수 없으므로 정상적인 SoundEffect.Play()로 어떻게 남았는지 떠나 보겠습니다. 생각 해줘서 고마워. – DanTonyBrown

0
List<SoundEffectInstance> explosionSoundInstanceList; 


     explosionSound = Content.Load<SoundEffect>("sound/explosion"); 

     explosionSoundInstanceList = new List<SoundEffectInstance>(MAX_EXPLOSIONS); 

     for (int i = 0; i < MAX_EXPLOSIONS; i++) 
     { 
      explosionSoundInstanceList.Add(explosionSound.CreateInstance()); 
     } 



private void PlayExplosionSound(float volume, float pitch, float pan) 
    { 

     ClampSoundValues(ref volume, ref pitch, ref pan); 

     for (int i = 0; i < explosionSoundInstanceList.Count; i++) 
     { 
      if (explosionSoundInstanceList[i].State == SoundState.Stopped) 
      { 
       explosionSoundInstanceList[i].Volume = volume/(i+1); 
       explosionSoundInstanceList[i].Pitch = pitch; 
       explosionSoundInstanceList[i].Pan = pan; 
       explosionSoundInstanceList[i].Play(); 
       return; 
      } 

     } 

     return; 
    } 

제대로 작동합니다. 인스턴스화 후 360의 쓰레기는 0입니다. 한도를 맞추면 우아하게 실패합니다.

내가 사용하는 것입니다.

는 I 예외가 떨어질 바보 같은 값으로 설정 한 thusly 히

private static void ClampSoundValues(ref float volume, ref float pitch, ref float pan) 
    { 
     volume = MathHelper.Clamp(volume, -1f, 1f); 
     pitch = MathHelper.Clamp(pitch, -1f, 1f); 
     pan = MathHelper.Clamp(pan, -1f, 1f); 
    } 

값을 클램프.

관련 문제