2012-04-03 4 views
3

Silverlight 환경에서 실행되는 XNA 아케이드 게임이 있습니다. 이 게임에는 배경 음악으로 무작위로 재생되는 몇 개의 사운드 클립이 있습니다.WP7에서 노래 재생 시작시 성능이 좋지 않음

http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.media.songcollection.aspx에 명시된 바와 같이 개발자는 미디어 플레이어를 완전히 제어 할 수 없습니다. 특히 개발자는 노래 모음을 만들거나 노래를 재생 대기열에 추가 할 수 없습니다. MediaPlayer.Play()를 호출하여 한 번에 하나씩 노래를 재생할 것을 권장합니다.

그게 바로 내가하고있는 일이지만 다른 노래가 연주 될 때마다 성능 결함이 발생할 수 있습니다. 런타임에가 아니라 게임 초기화 중에 모든 사운드 클립이로드 되더라도 MediaPlayer.Play()를 호출하면 게임이 잠시 중단됩니다. 일부 기기에서만 발생합니다 (예 : HTC Mozart). 반대로 게임을 실행하는 동안 게임 사운드를 비활성화하고 휴대 전화의 음악 플레이어에서 동일한 클립을 재생하면 노래를 변경하는 동안 성능 문제가 없습니다. 또한 SoundEffect 클래스를 사용하여 클립을 재생하면 성능 문제가 발생하지 않습니다. 그러나 다음 두 가지 이유로 백그라운드 사운드 용도로 MediaPlayer를 사용하고자합니다. - 재생이 완료되면 SoundEffect에서 알림을 표시하지 않음 - SoundEffect가 .mp3 파일 및 .wav 파일을 사용하여 작동하지 않는 것 같습니다. 매우 비쌉니다.

필자는 프로파일 링 테스트를 실행하여 성능 저하 시간 프레임이 MediaPlayer.Play()로부터 몇 밀리 초 후에 시작되고 약 0.4 초 동안 계속되는지 확인했습니다. 이 시간 동안 내 게임은 일반 게임 타이머의 Update() 함수와 같은 무거운 가중치 연산을 실행하지 않습니다.

public void PlayBackgroundMusic(Song song) 
{ 
    if ((!(App.Current as App).AppModel.SoundDisabled) && (song != null)) 
    { 
     if (MediaPlayer.State != MediaState.Stopped) 
     { 
      StopBackgroundMusic(); 
     } 
     MediaPlayer.Play(song); 
    } 
} 

public void StopBackgroundMusic() 
{ 
    MediaPlayer.Stop(); 
} 

및 핸들러 :

private void OnMediaStateChanged(object sender, EventArgs e) 
{ 
    if (MediaPlayer.State != MediaState.Playing) 
    { 
     if (!AppModel.SoundDisabled) 
     { 
      int index = soundRandomizer.Next(0, sounds.Length - 1); 
      PlayBackgroundMusic(sounds[index]); 
     } 
    } 
} 

어떤 제안이 여기에

내 코드 조각인가?

+0

일부 WP7 장치에서 나의 게임에서 같은 문제가 관찰되었다. – Mix

답변

1

어쨌든 나는 만족 한 해결책을 발견했다. 거의 완벽하게 흔들림을 제거합니다. 그 아이디어는 모든 MediaPlayer API를 스레드 풀에서 얻은 별도의 스레드에서 사용하는 것입니다. 나는 그것이 문제를 어떻게 해결하는지 알지 못한다. 그러나 이것은 나를 위해 정말로 잘 작동한다 :

public void PlayBackgroundMusic(Song song) 
{ 
    if ((!(App.Current as App).AppModel.SoundDisabled) && (song != null)) 
    { 
     if (MediaPlayer.State != MediaState.Stopped) 
     { 
      StopBackgroundMusic(); 
     } 

     ThreadPool.QueueUserWorkItem((o) => 
     { 
      MediaPlayer.Play(song); 
     } 
    } 
} 

public void StopBackgroundMusic() 
{ 
    ThreadPool.QueueUserWorkItem((o) => 
    { 
     MediaPlayer.Stop(); 
    } 
} 
관련 문제