2013-04-01 32 views
1

我正在用libgdx構建一個滾動式射擊遊戲。在Windows中,一切都運行得很好,但在Android上我得到明顯的抖動,並且幀速率從61 fps avg沒有聲音下降到48-56 fps avg與聲音。它同時播放很多小型聲音效果,因爲有很多子彈要射擊並且敵人立即擊中。我的聲音例行:android gdx聲音性能問題

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.audio.Sound; 

public class SoundFX { 

    static final int BGDIE = 1, BGHIT = 2, BGLASER = 3, BGSPAWN = 4, PDIE = 5, PHIT = 6, PLASER = 7, PSPAWN = 8, PAUSE = 9; 
    Sound S_BGDIE, S_BGHIT, S_BGLASER, S_BGSPAWN, S_PDIE, S_PHIT, S_PLASER, S_PSPAWN, S_PAUSE; 

    public void load() 
    { 
     S_BGDIE = Gdx.audio.newSound(Gdx.files.internal("data/sfx/badguydie.mp3")); 
     S_BGHIT = Gdx.audio.newSound(Gdx.files.internal("data/sfx/badguygothit.mp3")); 
     S_BGLASER = Gdx.audio.newSound(Gdx.files.internal("data/sfx/badguylaser.mp3")); 
     S_BGSPAWN = Gdx.audio.newSound(Gdx.files.internal("data/sfx/badguyspawn.mp3")); 
     S_PDIE = Gdx.audio.newSound(Gdx.files.internal("data/sfx/playerdie.mp3")); 
     S_PHIT = Gdx.audio.newSound(Gdx.files.internal("data/sfx/playergothit.mp3")); 
     S_PLASER = Gdx.audio.newSound(Gdx.files.internal("data/sfx/playerlaser.mp3")); 
     S_PSPAWN = Gdx.audio.newSound(Gdx.files.internal("data/sfx/playerspawn.mp3")); 
     S_PAUSE = Gdx.audio.newSound(Gdx.files.internal("data/sfx/pause.mp3")); 
    } 

    public void unload() 
    { 
     S_BGDIE.dispose(); 
     S_BGHIT.dispose(); 
     S_BGLASER.dispose(); 
     S_BGSPAWN.dispose(); 
     S_PDIE.dispose(); 
     S_PHIT.dispose(); 
     S_PLASER.dispose(); 
     S_PSPAWN.dispose(); 
     S_PAUSE.dispose(); 
    } 

    public void play(int id) 
    { 
     switch(id) 
     { 
     case BGDIE: 
      S_BGDIE.play(); 
      break; 
     case BGHIT: 
      S_BGHIT.play(); 
      break; 
     case BGLASER: 
      S_BGLASER.play(); 
      break; 
     case BGSPAWN: 
      S_BGSPAWN.play(); 
      break; 
     case PDIE: 
      S_PDIE.play(); 
      break; 
     case PHIT: 
      S_PHIT.play(); 
      break; 
     case PLASER: 
      S_PLASER.play(); 
      break; 
     case PSPAWN: 
      S_PSPAWN.play(); 
      break; 
     case PAUSE: 
      S_PAUSE.play(); 
      break; 
     default: 
      System.out.println("invalid sfx call"); 
      break; 
     } 
    } 
} 

戲被調用大約4-10次,第二取決於發生了什麼事在遊戲中,聲音效果是持續少於並在每個avarage 8KB第二。

這是怎麼回事,我該如何解決這個問題?它使遊戲看起來非常不專業,而且在難度上幾乎無法播放。

回答

5

關於爲什麼在播放多個聲音時注意到性能大幅下降的問題的一個背景。這是因爲在封面之下,libgdx需要在將聲音播放回用戶之前將它們混合在一起。當你同時運行一定數量的聲音時,系統對混音的要求變得非常高。由於您很可能在渲染線程上嘗試播放聲音,因此需求增加會導致幀率下降。

根據我對遊戲中任何類型聲音效果的體驗,當您遇到一種情況,即同時播放很多小聲音時,幾乎沒有解決方案。我會寫這些是不是更具體的解決方案一般用於libGDX:在單個線程

1)播放所有的聲音這是目前你在做什麼,雖然它沒有一次大井工作播放它的聲音數量很容易實現,並且在大多數情況下它都可以工作。但是,一旦你獲得足夠的聲音一起玩,你會發現滯後和質量差。

2)播放從渲染線程

這是一種可能的方法(並根據若框架允許),它不是非常好,因爲它沒有很好地擴展一個單獨的線程的聲音。但是,如果您只是遭受輕微的表演損失,並且不期望同時播放大量聲音(〜20 +),這是相對較小的變化,通常會解決問題。

3)播放聲音高達帽

該解決方案是多一點的工作,如果你有必須發揮的聲音可能無法接受。您只需跟蹤播放聲音的次數,並允許播放額外的聲音,直到您達到某個點。任何超出上限的東西都不會播放。這可以保證一定程度的性能。這種方法最大的缺點是,如果在角色受到嚴重傷害並且不能播放時播放聲音,那麼這可能會使用戶感到不安,因爲他們可能正在聽聲音以瞭解他們是否即將死亡,但是卻發現自己已經死了。

4)選擇性起着重要的聲音

這是一個有點困難實現,但它的工程非常好,你基本上設置對性能的上限。你想要做的是確定要播放聲音的優先級。它靠近你嗎?它響亮嗎?是不是重要?然後,您只播放足夠重要的聲音以達到某個上限(可能是4,6,8等)。您還需要跟蹤當前正在播放多少聲音,以確定您可以在給定點播放多少個新聲音。

+0

謝謝!非常廣泛的答案。現在我知道在哪裏看,以及如何解決它。我首先要看看是否在併發聲音上設置上限可以解決問題。如果是這樣,我會增加聲音優先級。如果沒有,我將使用一個具有較低優先級的獨立聲音線程。 – Hatagashira

+0

很高興幫助:) – Jyro117

0

解決方法:播放對玩家不太重要的聲音,只有當前FPS高於某個值時纔可以播放。例如:

if (Gdx.graphics.getFramesPerSecond() > 56) playSound(); 

無論FPS值如何,都應播放重要的聲音。