我正在編寫一個使用錄製的樣本播放音樂的Android應用程序(使用SoundPool)。我有一個播放器根據當前時間(realTimeElapsed)檢查我必須播放哪些樣本。玩家獲得更新,我設置爲1毫秒的計時器。大部分時間這個工作正常,但有時我有一些延遲約100毫秒。Android:精確播放音頻的時機
我找不到增加定時器優先級的方法,是否有另一種方法來獲得這些延遲?
我在同一時間使用openGL渲染場景,但是如果禁用所有繪圖,我會得到相同的延遲。
感謝
編輯:
我TraceView分析它:音頻線程(線程16)獲取每毫秒執行。但在t = 2580時,有大約200毫秒的突破。線程在此期間未處於睡眠狀態,但在方法SoundPool.play中並且被中斷。每當我有這樣的延遲,音頻線程就會中斷。沒有辦法阻止這些干擾嗎?
我已經將GL線程(即中斷音頻線程)的優先級設置爲THREAD_PRIORITY_LOWEST。
右鍵點擊圖片並選擇「顯示圖像」或附近的其他物業,可得到全分辨率的圖像。
200ms聽起來很大。這可能是垃圾收集造成的嗎?發生垃圾回收時會有一條消息被打印到logcat。只要確保它是來自您的流程的消息,而不是其他任何隨機流程。 – JesusFreke 2012-04-15 03:51:13
此時沒有GC正在運行,您會在TraceView中看到GC。在這200ms期間,OpenGL線程一直在運行(請右鍵單擊圖像並選擇「顯示圖像」或其附近的某個圖像以全分辨率查看圖像) – osiris81 2012-04-15 13:41:37
如果我不想使用Soundpool,不會調用SoundPool的播放方法,我沒有任何延遲。我將不得不爲這個問題開一個新的線程 – osiris81 2012-04-15 21:27:22