2

我用 libgdx + java 开发了一个不错的游戏,用于 android 作为目标平台。我快到最后了,剩下的任务就是改进地图。直到现在我还在运行——在桌面上调试我的游戏,因为你知道 libgdx 是跨平台的,而我的期望只是右键单击并导出 android。当然我试过了,然后呢?突然间,我撞到了墙上。问题是我的音效在 android 上听起来不太好。它们在桌面上运行良好,但在 android 上效果不佳。让我用几个问题和例子来分析这个案例:如果我们考虑爆炸音效:一个场景;车辆撞到爆炸物我从 box2d 中捕捉到接触,并在爆炸音效上调用 play 方法。我期望的是正常的爆炸声。在桌面我听到它,

我尝试了许多其他线程的建议:

  1. 我尝试了 44.1k hz 16 位 wav 文件格式,ogg 文件 22.05 k hz wav 文件格式,它们听起来都一样。
  2. 音效不会太短或太长。好吧,没关系,我的是 3 秒。
  3. 我试图用 fl-studio 和 audacity 重新保存或安排它。

我在 s5 mini experia z1 和 z3 上都试过了。

mp3 文件在我使用音乐课时效果很好,但我有很多音效,而音乐课不适合这种用途,所以我需要解决这个问题

我在相同条件下尝试了一些与爆炸音效不同的其他声音文件(我的意思是声音格式频率或比特率等)。

我检查了声音是否完全加载。是的,它已完全加载,但听起来一样,当然我在游戏开始后玩了一会儿。这句话的意思是我至少要等下一帧才能播放声音,因为有些人说它不能在某些线程的第一帧播放。

如果我们想看一些代码:我如何加载文件:

这在游戏刚开始时被调用,而用户正在耐心地跟随加载屏幕中的进度条:)

private void loadSoundEffects(){
    assetMan.load("sounds/explosion.wav", Sound.class);
}

然后我在加载完成后以另一种方法将声音放入全局排序地图

   soundEffects.put("explosion",assetMan.get("sounds/explosion.wav", Sound.class));

在我的声音管理器课程中,我有这样的方法

public void playSingle(String name,float x ,float y){
    Sound sound=null;
    sound=soundEffects.get(name);
    long id=sound.play();
    sound.setVolume(id, getVolume(x, y));//dont worry here volume returns always 1 for texting
}

当我在这里调用 play 方法时,它返回一个正 ID(如果出现问题,它将返回 -1)

为了加载东西,我也尝试过这种方式:

sound=Gdx.audio.newSound(Gdx.files.internal("sounds/explosion.wav"));

这是一个很大的项目,所以我可能有 70 多个课程 => 我无法将所有课程都粘贴到这里 :) 但我已经准备好回答任何方式、内容、地点、原因、何时出现问题,请问......如果您需要更多代码或文件或其他内容,请告诉我

让我们看看听起来如何;我上传了正常的爆炸 wav 文件和我在这个 rar 中从手机录制的文件:

http://www.filedropper.com/soundeffects

你会听到一些类似滴答声的声音,真的听起来像这样:)

编辑:添加更多信息

它在 Windows 7 上运行,我的操作系统是 win 7

我正在使用最新的 libGDX。我的 IDE 是日食。我尝试通过拔下电缆来摆脱调试器,但结果是一样的。

使用音效的文件大小必须小于 1 mb,正如 wiki 所说,我的文件是 688 KB

编辑:与性能有关?

我开始思考这是否与我的代码性能有关。想想导致延迟的其他原因,它会对声音产生这种影响,但这里有一些值游戏在 55-60 fps 下工作,甚至有时所有计算都需要不到 15 毫秒,但我听到相同的声音,文件很少像 60 KB。所以,我会继续考虑这些文件。如果它们坏了?还是格式问题?你有一个有效的音效文件吗?或有关格式的任何建议?我在某处读过 96khz 16 位 ogg 文件,我也试过了。

编辑:重要通知

我在手机上玩我的游戏。我开车撞了一些炸药。听起来一样,然后我回到菜单。我忘记打开手机了。游戏正在运行。但是屏幕会自动锁定。就这样离开了大概15-20分钟。然后再试一次,我解锁了屏幕,发生了什么?突然所有的炸药都爆炸了,我听到声音真的很好,很完整,菜单屏幕仍在显示。因此,我想我可以在游戏暂停足够长的时间后得出结论,音效准备好并且可以很好地播放。现在这意味着什么?音效尚未从内存中加载,但我正在尝试播放?或者 get-ready 在这里有另一个含义?我使用资产管理器的 isLoaded() 方法检查了它是否已加载,它返回 true。我在调用声音的播放方法之前这样做了。我应该相信这个 isLoaded 方法吗?或者是什么?

好吧,伙计们提前感谢您的帮助。

对不起,我保留了一段时间,我会继续尝试和研究..

4

2 回答 2

3

我很确定这里的问题是你的声音效果是 1MB 或更大。它在 libgdx wiki 中说,如果声音文件大于 1MB,则会在 Android 上引起问题,需要使用音乐类而不是声音类。

于 2015-08-30T21:16:42.143 回答
2

我找到了实际的问题和解决方案。

它与性能或文件或android无关。这是 libGDX 的 android 端的问题(可能不被视为错误,但与桌面版本不同)。让我很快标记一下情况,然后回答:

我有很多音效实例。独立加载并保存在独立指针中。所以我的代码中这些音效实例之间没有关系。但它们在某个地方 libGDX 中以某种方式相关。因为情况是这样的:我的游戏中有一个枪类。并且枪有音效。如果按下开火按钮,枪继续通过调用 sound.resume() 方法循环其声音效果,如果未按下按钮,则使用 sound.pause() 方法暂停。在桌面这个暂停方法只暂停枪的声音效果。但在 android 中,它会暂停所有音效,或者不确定可能只有最后一个音效被触发。所以在每一帧中,如果枪没有开火,我会在枪上调用暂停方法' s 音效(我的糟糕实现),同时为一些其他音效调用播放,而对枪的暂停调用会取消所有其他音效。这就是我听到很短的嘈杂声的方式..

一种解决方案是使用将要暂停的声音的 id 调用 pause 方法。另一种解决方案是尝试使用不需要调用 pause 方法的不同实现。

感谢任何关心我的问题的人,即使他无法回答。我认为 Nahro 的答案可以留在那里,因为即使这不是我的情况,它也可以解决问题。如果您认为这个问题将来对某人没有帮助,我可以删除它,请在评论中说明,但我认为它有点深,很难注意到,所以我想人们会在找到解决方案之前找到这篇文章。

于 2015-08-31T15:43:15.717 回答