gpt4 book ai didi

android gdx 声音性能问题

转载 作者:行者123 更新时间:2023-11-29 15:23:30 28 4
gpt4 key购买 nike

我正在使用 libgdx 构建一个滚动射击游戏。在 Windows 中,一切运行正常,但在 Android 上,我得到明显的抖动,帧率从没有声音的 61 fps avg 下降到有声音的 48-56 fps avg。它同时播放很多小音效,因为有很多子弹要发射,同时要击中敌人。我的声音例程:

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;
}
}
}

play 大约每秒调用 4-10 次,具体取决于游戏中发生的情况,音效持续时间不到一秒,平均每个 8kb。

这是怎么回事,我该如何解决?这让游戏看起来非常不专业,而且在困难关卡上几乎无法玩。

最佳答案

有关为什么在播放多个声音时性能下降如此之大的问题的一些背景知识。这是因为在幕后,libgdx 需要将声音混合在一起,然后再将它们播放给用户。当您同时运行一定数量的声音时,对系统进行混音的要求就会明显提高。由于您可能会在渲染线程上尝试播放声音,因此这种需求增加会导致帧率下降。

根据我在游戏中使用任何类型的音效的经验,当您遇到同时播放大量小声音的情况时,几乎没有解决方案。我将把这些写成比 libGDX 的具体解决方案更通用的解决方案:

1) 在一个线程上播放所有声音

这就是您目前正在做的事情,虽然它在播放大量声音后效果不佳,但它很容易实现,并且在大多数情况下都能正常工作。但是,一旦您获得了足够多的声音一起播放,您就会注意到延迟和质量差。

2) 在与渲染线程不同的线程上播放声音

这是一种可能的方法(并且取决于框架是否允许),它不是很好,因为它不能很好地扩展。但是,如果您只是遭受轻微的性能损失并且不希望同时播放大量(~20+)声音,那么这是一个相对较小的更改,通常会解决问题。

3) 播放声音到上限

此解决方案需要更多工作,如果您有必须播放的声音,则可能无法接受。您只需跟踪播放的声音数量,并允许播放额外的声音,直到达到某个特定点。任何超过上限的东西都不会播放。这使您可以保证一定水平的性能。这种方法最大的缺点是,如果你在你的角色受重伤时播放声音并且没有播放,那么这可能会让用户感到不安,因为他们可能正在聆听声音以了解他们是否很快就会死去,却发现自己已经死了。

4) 有选择地播放重要声音

这实现起来有点困难,但效果非常好,因为您实际上是在设置性能上限。您要做的是确定要播放的声音的优先级。它离你很近吗?声音大吗?是不是重要?然后,您只播放重要到可以播放到某个上限(可能是 4、6、8 等)的声音。您还需要跟踪当前正在播放的声音数量,以确定在给定时间点可以播放多少新声音。

关于android gdx 声音性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15742812/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com