每当我在安卓设备上的LibGDX游戏中播放音效时,游戏就会出现卡顿。 我已经在三个三星设备上尝试过这个游戏:
- 在Galaxy S7 Edge(2016年,Android 8)和Galaxy Tab S 10.5(2014年,Android 6.0.1)上,游戏仍然可玩,但是每当有多个声音效果被播放时(循环声音效果不是问题),游戏就不会运行得很流畅。
- 然而,在Galaxy S20 Ultra(2020年,Android 10)上,游戏无法进行:每次调用Sound.play()需要2...4毫秒,并导致“AUDIO_OUTPUT_FLAG_FAST被服务器拒绝;frameCount 0 - > 54276”错误。其他设备不会出现此错误,但Sound.play()仍然需要1...2毫秒,这当然是16毫秒帧的相当大的一部分。
所以我认为很明显的问题在于Sound.play()方法,而不是例如同时播放的声音数量(我将其限制为8个,但也尝试了4个),或者Android设备处理声音太慢(在这种情况下,6年前的GT不应该比今年的高端S20更快),或者声音效果文件太大(我用于测试的声音原本是3.8 kB的WAV)。是的,我正在使用AssetManager预先加载声音。
我现在已经花了两天时间进行研究,在不同的论坛上找到了大约15-20个主题,涉及我认为是相同或相关问题,并尝试了所有建议的修复措施,但没有成功: - 将音频格式从WAV更改为OGG - 不同的采样率:44.1k、48k、96k(96k时,没有卡顿和错误,但也没有听得见的声音) - 在声音效果的结尾添加1或2秒钟的静音,与所有上述格式和采样率的组合。 - 有人说在后台循环播放一个静音的声音剪辑可以解决问题,但我无论如何都会在游戏中不断循环另一个声音(汽车引擎),而这似乎没有任何影响。 我还看到建议使用Music类而不是Sound,但对于Box2D的碰撞声效来说不太适用,因为无法调整音调。
我唯一找到但尚未尝试的解决方法是在不同的线程上播放声音。我没有尝试过,因为我对多线程不熟悉,并且没有找到足够全面的指南来告诉我如何在LibGDX中正确地执行它。我还假设该方法可能会对任何必须在主线程中由某个动作者暂停、停止或调整播放的声音造成问题。此外,根据https://github.com/libgdx/libgdx/wiki/Threading,“您绝不能在与图形或音频有关的任何内容上执行多线程操作”。
因此,在我开始熟悉这个主题(多线程)之前,我只想再问一次:真的没有其他解决方案吗?一个今年的高端Android设备竟然无法比4毫秒更快地启动小型WAV声音,这让人感到不舒服。Play商店里有很多带有工作音效和平滑游戏体验的游戏,他们真的都在使用多线程吗?
我现在已经花了两天时间进行研究,在不同的论坛上找到了大约15-20个主题,涉及我认为是相同或相关问题,并尝试了所有建议的修复措施,但没有成功: - 将音频格式从WAV更改为OGG - 不同的采样率:44.1k、48k、96k(96k时,没有卡顿和错误,但也没有听得见的声音) - 在声音效果的结尾添加1或2秒钟的静音,与所有上述格式和采样率的组合。 - 有人说在后台循环播放一个静音的声音剪辑可以解决问题,但我无论如何都会在游戏中不断循环另一个声音(汽车引擎),而这似乎没有任何影响。 我还看到建议使用Music类而不是Sound,但对于Box2D的碰撞声效来说不太适用,因为无法调整音调。
我唯一找到但尚未尝试的解决方法是在不同的线程上播放声音。我没有尝试过,因为我对多线程不熟悉,并且没有找到足够全面的指南来告诉我如何在LibGDX中正确地执行它。我还假设该方法可能会对任何必须在主线程中由某个动作者暂停、停止或调整播放的声音造成问题。此外,根据https://github.com/libgdx/libgdx/wiki/Threading,“您绝不能在与图形或音频有关的任何内容上执行多线程操作”。
因此,在我开始熟悉这个主题(多线程)之前,我只想再问一次:真的没有其他解决方案吗?一个今年的高端Android设备竟然无法比4毫秒更快地启动小型WAV声音,这让人感到不舒服。Play商店里有很多带有工作音效和平滑游戏体验的游戏,他们真的都在使用多线程吗?