2011-06-17 52 views
0

我有一個名爲Sound.java的類,它由3個函數(initSound,addSound和playSound)組成。SoundPool放慢應用程序

public static void initSound(Context con) { 
    mContext = con; 
    soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0); 
    soundPoolMap = new HashMap<Integer, Integer>(); 
    audioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE); 
    streamVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
    streamVolume = streamVolume/audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 
} 

public static void addSound(int index, int SoundID) { 
    soundPoolMap.put(index, soundPool.load(mContext, SoundID, 1)); 
} 

public static void playSound(int index) { 
    soundPool.play(soundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f); 
} 

我在MainGame.java構造函數中調用了initSound和addSound。

Sound.initSound(getContext()); 
Sound.addSound(1, R.raw.machine_gun); 

並在MainGame.java中的線程(循環)內調用playSound。當一個事件被觸發時,PlaySound每秒鐘都會調用一次(例如,當一個敵人在視線內時,部隊(多於一個)會連續射擊(播放聲音)直到敵人死亡)。

Sound.playSound(1); 

問題是當聲音播放時,應用程序正在放慢速度。 我使用的是soundpool,因爲就我所知的聲音效果而言,soundpool比mediaplayer更好。 (我已經試過mediaplayer和滯後更多。)

我使用的聲音文件是.wav(無符號8位PCM,1通道,8000hz),大小爲5.44KB。

有沒有更好的方式來播放效果聲音而不降低遊戲性能,或者是我的錯?我非常感謝任何想法和迴應。

回答

0

根據SoundPool docs,它解碼爲16位PCM,所以你可以改變,看看你是否得到了一些表現。除此之外,你的代碼看起來與我之前完成的東西非常相似(至少據我記得),我沒有看到任何重要的性能問題(我相信我甚至沒有使用WAV,我只是使用OGG,但我不確定)。你是在一個實際的設備上嘗試這個,還是隻是模擬器?

+0

我還沒有嘗試過實際的設備,只是在模擬器上。好的,我會嘗試解碼到16bit pcm並立即發佈結果。 thx – flowoverstack

+0

然後我可以看到性能問題發生,特別是如果你有一臺特別慢的機器。這只是更多的東西。實際上,這不應該是一個大問題。就像我說的,我已經使用了基本相同的代碼。我看到的唯一區別是我使用了優先級0而不是1(我想這可能會有所幫助),而且我沒有使用HashMap來存儲這些ID(我認爲這會消耗一點CPU時間,但在一次查找中,我看不出這是一個問題)。 – kabuko

+0

嗨,我已經試過了16位PCM,但它仍然減慢了性能。我把優先級設置爲0,它確實使perf略微更好,但我認爲這還不夠。我用neroWaveEditor(從原始長度00:00:00:690到00:00:00:220)剪切了16bit PCM wav聲音文件,並且我的演奏效果更好,但仍然比不使用聲音:(並且使用hashmap來存儲該ID只吃了一次CPU時間(當添加&初始化)是正確的?我想這就像你說機器很慢,我沒有嘗試在實際的設備上,因爲我的實際設備有問題。你的迴應:D – flowoverstack

0

我有同樣的問題。然後我爲soundpool創建了一個新線程,並在while循環中添加了20ms的睡眠時間。問題沒有了。