Libgdx 音效播放不流畅或不完整仅在 Android 上出现问题(声音效果滞后)
Libgdx Sound Effect is not playing Fluently or Completely issue only on Android (lagg effect on sound)
我用 libgdx + java 开发了一款不错的游戏,目标平台是 android。
我快结束了,剩下的任务只是改进地图。
直到现在我都是 运行 - 在桌面上调试我的游戏,因为你知道 libgdx 是跨平台的,我的期望是右键单击并导出 android。
当然我试过了,然后呢?突然间我撞到了墙上。
问题是我的音效在 android.They 上听起来不太好,但在 android 上效果很好,但在 android 上效果不佳。让我用几个问题和例子来分析这个案例:
如果我们考虑爆炸音效:
场景;车辆撞到爆炸物我从 box2d 捕捉到接触并调用爆炸音效的播放方法。
我期望的是正常的爆炸声。
在台式机上我听到了,没问题,但在 android 中我听到的只是非常非常短的噪音(真的很短,可能是几毫秒)然后是长时间的沉默,过了一会儿又是短暂的噪音
我尝试了什么:
我尝试了很多其他线程的建议,它们是:
- 我试过格式 44.1k hz 16 位 wav 文件格式相同 ogg 文件 22.05 k hz wav 文件它们听起来都一样。
- 音效不会太短或太长。好的,没关系,我的是3秒。
- 我尝试用 fl-studio 和 audacity 重新保存或整理它。
我在 s5 mini experia z1 和 z3 上都试过了。
mp3 文件在我使用音乐时效果很好 class
但是我有很多音效和音乐class不适合那个用途所以我需要解决这个问题
我在相同条件下尝试了一些与我的爆炸音效不同的其他声音文件(我的意思是声音格式频率或比特率等)。
我检查了声音是否完全加载。是的,它已完全加载但听起来一样,当然我在游戏开始一段时间后正在玩它。用这句话我的意思是我至少等到下一帧才能播放声音,因为有些人说它不能在某些线程的第一帧播放。
如果我们想看一些代码:
我如何加载文件:
当用户耐心地跟随加载屏幕中的进度条时游戏刚刚开始时调用:)
private void loadSoundEffects(){
assetMan.load("sounds/explosion.wav", Sound.class);
}
然后我在加载完成后用另一种方法将声音放入全局排序地图
soundEffects.put("explosion",assetMan.get("sounds/explosion.wav", Sound.class));
在我的声音管理器里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 方法时,它 return 是一个正 id(如果出现问题,它将 return -1)
加载东西我也试过这样:
sound=Gdx.audio.newSound(Gdx.files.internal("sounds/explosion.wav"));
这是一个大项目,所以我可能有 70 多个 classes => 我无法将它们全部粘贴到这里 :)
但我准备好回答任何类型的如何,什么,在哪里,为什么,什么时候提问,请问..
如果您需要更多代码或文件或其他东西,请告诉我
让我们看看听起来如何;我在这个 rar 中上传了正常的爆炸 wav 文件和我从 phone 录制的文件:
http://www.filedropper.com/soundeffects
你会听到一些滴答声,真的是这样的:)
编辑:添加更多信息
正在 windows 7 我的 OS 是 win 7
我正在使用最新的 libGDX。我的 IDE 是 eclipse。我尝试通过拔下电缆来摆脱调试器,但结果是一样的。
如 wiki 所述,音效使用文件大小必须小于 1 mb,而我的文件是 688 KB
编辑:与性能有关?
我开始考虑它是否与我的代码性能有关。想想其他一些导致延迟的原因,它会对声音产生这种影响,但这里有一些值游戏以 55-60 fps 运行,甚至有时所有计算都需要不到 15 毫秒,但我听到相同的声音,与非常小的文件相同像 60 KB。所以,我会继续考虑这些文件。如果他们坏了?还是格式问题?你有有效的音效文件吗?或关于格式的任何建议?我在某处读到 96khz 16 位 ogg 文件我也试过了。
编辑:重要通知
我在手机上玩游戏。我开车撞到了一些炸药。听起来一样,然后我回到菜单。我忘了打开 phone。游戏是 运行。但是屏幕自动锁定。它就这样离开了大概 15-20 分钟。然后再尝试一次我解锁屏幕,发生了什么事?突然间,所有炸药都爆炸了,我听到声音真的很好很完整,菜单屏幕仍在显示。因此,我认为当游戏暂停足够长的时间音效准备就绪并且可以很好地播放时,我可以得出结论。现在这是什么意思?声音效果还没有从内存中加载,但我正在尝试播放?或者 get-ready 在这里有另一个含义?我使用资产管理器的 isLoaded() 方法检查它是否已加载,它 returned 为真。我在对声音调用 play 方法之前就这样做了。我应该相信这个 isLoaded 方法吗?或者什么?
好的,伙计们提前感谢您的帮助。
对不起,我留的时间有点长,我会继续尝试和研究..
我很确定这里的问题是您的音效是 1MB 或更大。它在 libgdx wiki 中说,如果声音文件大于 1MB,它会导致 Android 出现问题,需要使用音乐 class 而不是声音 class.
我找到了实际问题和解决方案。
它与性能或文件或 android 无关。这是 libGDX 的 android 方面的问题(可能不被视为错误,但与桌面版本不同)。让我很快地标记一下情况然后回答:
我有很多音效实例。独立加载并保存在独立的指针中。所以我的代码中那些音效实例之间没有关系。但它们在某个地方有某种关联 libGDX。因为案例是这样的:我在游戏中有一把枪class。而且枪有音效。如果按下开火按钮的枪通过调用 sound.resume() 方法继续循环其音效,如果未按下按钮,则使用 sound.pause() 方法暂停。在桌面上,这种暂停方法只暂停枪的声音效果。但在 android 中,它会暂停所有音效,或者不确定是否只暂停最后一个被触发的音效。因此,在每一帧中,如果枪没有开火,我会在枪的音效上调用 pause 方法(我的错误实现),同时为其他一些音效调用 play 并且枪上的暂停调用会取消所有其他音效。我就是这样听到很短的噪音..
一种解决方案是使用将要暂停的声音的 id 调用 pause 方法。另一种解决方案是尝试一种不需要调用 pause 方法的不同实现。
感谢任何关心我的问题的人,即使他 answer.I 认为 Nahro 的回答可以留在那里,因为它也解决了一个问题,即使那不是我的情况。如果你认为这个问题以后对某人没有帮助,我可以删除它,请在评论中告诉我,但我认为它有点深,很难注意到,所以我想人们会在他们之前发现这个 post找到解决办法。
我用 libgdx + java 开发了一款不错的游戏,目标平台是 android。 我快结束了,剩下的任务只是改进地图。 直到现在我都是 运行 - 在桌面上调试我的游戏,因为你知道 libgdx 是跨平台的,我的期望是右键单击并导出 android。 当然我试过了,然后呢?突然间我撞到了墙上。 问题是我的音效在 android.They 上听起来不太好,但在 android 上效果很好,但在 android 上效果不佳。让我用几个问题和例子来分析这个案例: 如果我们考虑爆炸音效: 场景;车辆撞到爆炸物我从 box2d 捕捉到接触并调用爆炸音效的播放方法。 我期望的是正常的爆炸声。 在台式机上我听到了,没问题,但在 android 中我听到的只是非常非常短的噪音(真的很短,可能是几毫秒)然后是长时间的沉默,过了一会儿又是短暂的噪音 我尝试了什么:
我尝试了很多其他线程的建议,它们是:
- 我试过格式 44.1k hz 16 位 wav 文件格式相同 ogg 文件 22.05 k hz wav 文件它们听起来都一样。
- 音效不会太短或太长。好的,没关系,我的是3秒。
- 我尝试用 fl-studio 和 audacity 重新保存或整理它。
我在 s5 mini experia z1 和 z3 上都试过了。
mp3 文件在我使用音乐时效果很好 class 但是我有很多音效和音乐class不适合那个用途所以我需要解决这个问题
我在相同条件下尝试了一些与我的爆炸音效不同的其他声音文件(我的意思是声音格式频率或比特率等)。
我检查了声音是否完全加载。是的,它已完全加载但听起来一样,当然我在游戏开始一段时间后正在玩它。用这句话我的意思是我至少等到下一帧才能播放声音,因为有些人说它不能在某些线程的第一帧播放。
如果我们想看一些代码: 我如何加载文件:
当用户耐心地跟随加载屏幕中的进度条时游戏刚刚开始时调用:)
private void loadSoundEffects(){
assetMan.load("sounds/explosion.wav", Sound.class);
}
然后我在加载完成后用另一种方法将声音放入全局排序地图
soundEffects.put("explosion",assetMan.get("sounds/explosion.wav", Sound.class));
在我的声音管理器里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 方法时,它 return 是一个正 id(如果出现问题,它将 return -1)
加载东西我也试过这样:
sound=Gdx.audio.newSound(Gdx.files.internal("sounds/explosion.wav"));
这是一个大项目,所以我可能有 70 多个 classes => 我无法将它们全部粘贴到这里 :) 但我准备好回答任何类型的如何,什么,在哪里,为什么,什么时候提问,请问.. 如果您需要更多代码或文件或其他东西,请告诉我
让我们看看听起来如何;我在这个 rar 中上传了正常的爆炸 wav 文件和我从 phone 录制的文件:
http://www.filedropper.com/soundeffects
你会听到一些滴答声,真的是这样的:)
编辑:添加更多信息
正在 windows 7 我的 OS 是 win 7
我正在使用最新的 libGDX。我的 IDE 是 eclipse。我尝试通过拔下电缆来摆脱调试器,但结果是一样的。
如 wiki 所述,音效使用文件大小必须小于 1 mb,而我的文件是 688 KB
编辑:与性能有关?
我开始考虑它是否与我的代码性能有关。想想其他一些导致延迟的原因,它会对声音产生这种影响,但这里有一些值游戏以 55-60 fps 运行,甚至有时所有计算都需要不到 15 毫秒,但我听到相同的声音,与非常小的文件相同像 60 KB。所以,我会继续考虑这些文件。如果他们坏了?还是格式问题?你有有效的音效文件吗?或关于格式的任何建议?我在某处读到 96khz 16 位 ogg 文件我也试过了。
编辑:重要通知
我在手机上玩游戏。我开车撞到了一些炸药。听起来一样,然后我回到菜单。我忘了打开 phone。游戏是 运行。但是屏幕自动锁定。它就这样离开了大概 15-20 分钟。然后再尝试一次我解锁屏幕,发生了什么事?突然间,所有炸药都爆炸了,我听到声音真的很好很完整,菜单屏幕仍在显示。因此,我认为当游戏暂停足够长的时间音效准备就绪并且可以很好地播放时,我可以得出结论。现在这是什么意思?声音效果还没有从内存中加载,但我正在尝试播放?或者 get-ready 在这里有另一个含义?我使用资产管理器的 isLoaded() 方法检查它是否已加载,它 returned 为真。我在对声音调用 play 方法之前就这样做了。我应该相信这个 isLoaded 方法吗?或者什么?
好的,伙计们提前感谢您的帮助。
对不起,我留的时间有点长,我会继续尝试和研究..
我很确定这里的问题是您的音效是 1MB 或更大。它在 libgdx wiki 中说,如果声音文件大于 1MB,它会导致 Android 出现问题,需要使用音乐 class 而不是声音 class.
我找到了实际问题和解决方案。
它与性能或文件或 android 无关。这是 libGDX 的 android 方面的问题(可能不被视为错误,但与桌面版本不同)。让我很快地标记一下情况然后回答:
我有很多音效实例。独立加载并保存在独立的指针中。所以我的代码中那些音效实例之间没有关系。但它们在某个地方有某种关联 libGDX。因为案例是这样的:我在游戏中有一把枪class。而且枪有音效。如果按下开火按钮的枪通过调用 sound.resume() 方法继续循环其音效,如果未按下按钮,则使用 sound.pause() 方法暂停。在桌面上,这种暂停方法只暂停枪的声音效果。但在 android 中,它会暂停所有音效,或者不确定是否只暂停最后一个被触发的音效。因此,在每一帧中,如果枪没有开火,我会在枪的音效上调用 pause 方法(我的错误实现),同时为其他一些音效调用 play 并且枪上的暂停调用会取消所有其他音效。我就是这样听到很短的噪音..
一种解决方案是使用将要暂停的声音的 id 调用 pause 方法。另一种解决方案是尝试一种不需要调用 pause 方法的不同实现。
感谢任何关心我的问题的人,即使他 answer.I 认为 Nahro 的回答可以留在那里,因为它也解决了一个问题,即使那不是我的情况。如果你认为这个问题以后对某人没有帮助,我可以删除它,请在评论中告诉我,但我认为它有点深,很难注意到,所以我想人们会在他们之前发现这个 post找到解决办法。