- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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/
我有一个游戏编辑器,可以在单独的窗口(但在同一个 VM 中)中启动正在编辑的游戏。但是,当游戏关闭时,我想关闭它的 gdx 窗口,而不关闭整个应用程序(即编辑器)。 我目前在托管 LwjglAppli
我正在尝试在我的 libgdx 项目中实现 gdx-pay。所以我跟着Integration example with resolvers来自 libgdx wiki。 我在我的核心项目中创建了一个类
我在游戏中使用 libgdx。我想读/写文本文件来更新高分,非常简单。我已经在“$ANDROID-PROJECT/assets/data”中创建了三个文件,但是当我使用 Gdx.files.local
我正在使用 libgdx 框架,我不确定访问 opengl API 的首选方式是什么,我的应用程序使用 OpenGl 2.0(useGL20 标志设置为 true)。现在清除例如我可以做的屏幕: Gd
我使用 gdx-setup.jar 生成了一个 gradle 项目,然后将它导入到 Android Studio 中。但是当我尝试编译它时,我得到了这个错误。 我在生成和使用 Android API
我想在我的 libGDX 项目中使用 gdx-video 扩展来嵌入 YouTube 视频。我在 GitHub 上找到了这个扩展,但是在 Gradle 同步过程中有几条错误消息。我已将依赖项粘贴到 b
因此,我正在libgdx Wiki中进行简单的游戏操作,并且完成了这些操作,但出现了这些错误。 首先是: dropSound = new Gdx.audio.newSound(Gdx.files.in
我正在开发一款 Gdx 游戏,但我遇到了一些问题,我将简要解释一下: 我有 9 个球,按 3*3 排列,我需要检测我正在触摸的球,如下图所示: enter image description here
我正在使用 libgdx 构建一个滚动射击游戏。在 Windows 中,一切运行正常,但在 Android 上,我得到明显的抖动,帧率从没有声音的 61 fps avg 下降到有声音的 48-56 f
我们使用 libgdx 为我们在 Android 上的游戏进行图形渲染。似乎 libgdx 将来可以放弃对布局文件的支持。使用布局文件的缺点是解析它需要更长的时间。优点是使用它构建 UI 非常方便,而
我遇到了与 this question 中相同的问题,但那里的答案并没有解决我的问题。 我没有通过 gdxsetup.jar 创建项目,我只是包含了 gdx.jar 和 gdx-backend-and
我目前正在使用 gdx-freetype 库为我的游戏生成 BitmapFonts。这真的很方便,因为我可以用它来处理 Android 上的不同屏幕尺寸。问题是制作字体需要很长时间。在启动时,我生成了
我创建了一个新的 GDX 项目,添加了所有必要的配置,以便它按应有的方式运行。然而,问题是每当我关闭游戏窗口时,它都会显示以下错误: 任务 ':desktop:DesktopLauncher.main
我需要 Box2D GDX Android 的三角形定义。我会把宽度除以 3 还是有一个类?这是普通矩形的代码: _rect1 = CCSprite.sprite("Rec
我已经完成了 IAP 系统的设置,但我不知道如何检查用户是否实际拥有/已经购买了某种产品。使用适用于 Android 的 Google IAP Billing 我只是这样做了: Purchase IT
如何在不使用 libgdx 的情况下使用 gdx-bullet?这意味着如何在不使用完整 libgdx 库的情况下独立使用 gdx-bullet 扩展?使用 libgdx 对于数学来说是很好的。 当我
我已经使用Google App Store在Android上实现了gdx-pay的有效实施。我按照以下步骤进行操作:https://bitbucket.org/just4phil/gdxpayexam
当尝试执行这段代码时: public void load(String filename) { FileHandle file = Gdx.files.external(filename + "
我在 LibGDX 中遇到一个问题,当我调用 Gdx.input.getY() 时,它会选择一个位于应用程序相对于屏幕中心另一侧的像素。 public class Main extends Appli
我有一个预制的 json 文件,我想测试一下。这个 Json 文件将被修改,所以我想读/写。我注意到 internal 是只读的。所以我想将我的 Json 文件保存在本地存储中(通过 eclipse
我是一名优秀的程序员,十分优秀!