2013-04-01 63 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值如何,都应播放重要的声音。