我用 libgdx + java 开发了一个不错的游戏,用于 android 作为目标平台。我快到最后了,剩下的任务就是改进地图。直到现在我还在运行——在桌面上调试我的游戏,因为你知道 libgdx 是跨平台的,而我的期望只是右键单击并导出 android。当然我试过了,然后呢?突然间,我撞到了墙上。问题是我的音效在 android 上听起来不太好。它们在桌面上运行良好,但在 android 上效果不佳。让我用几个问题和例子来分析这个案例:如果我们考虑爆炸音效:一个场景;车辆撞到爆炸物我从 box2d 中捕捉到接触,并在爆炸音效上调用 play 方法。我期望的是正常的爆炸声。在桌面我听到它,
我尝试了许多其他线程的建议:
- 我尝试了 44.1k hz 16 位 wav 文件格式,ogg 文件 22.05 k hz wav 文件格式,它们听起来都一样。
- 音效不会太短或太长。好吧,没关系,我的是 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 方法吗?或者是什么?
好吧,伙计们提前感谢您的帮助。
对不起,我保留了一段时间,我会继续尝试和研究..