Flame(Flutter)游戏中音频播放异常(卡顿、延迟、停止)的问题求助
各位Flame/Flutter开发者好,我最近开发Flutter游戏时遇到了非常棘手的音频播放问题,想请大家帮忙排查分析:
环境与核心问题
我使用的是Flame 1.30.1 和 flame_audio 2.11.11 版本,在安卓模拟器上运行游戏时,音效播放出现了诡异的异常:前几次触发音效完全正常,但过一段时间后,音效会逐渐变得嘈杂混乱,甚至直接完全停止播放,偶尔还会出现延迟一分钟左右才触发音效的情况。
已尝试的两种解决方案(均无效)
我先后试了两种音频播放方式,但最终结果完全一致:
方案1:直接调用FlameAudio.play播放
import 'package:flame_audio/flame_audio.dart'; // 触发音效时直接调用 FlameAudio.play('sound_effects/block_pickup.mp3'); FlameAudio.play('sound_effects/block_placing.mp3');
方案2:使用AudioPool池化加载播放
担心是重复创建音频实例导致的问题,我又尝试用音频池预加载音效,设置了最大同时播放数:
import 'package:flame_audio/flame_audio.dart'; class PuzzleGameWorld extends World { late AudioPool poolBlockPickup; late AudioPool poolBlockPlacing; Future<void> onLoad() async { // 初始化音频池,设置最大同时播放数为4 poolBlockPickup = await FlameAudio.createPool( 'sound_effects/block_pickup.mp3', maxPlayers: 4, ); poolBlockPlacing = await FlameAudio.createPool( 'sound_effects/block_placing.mp3', maxPlayers: 4, ); } // 触发音效时调用 poolBlockPickup.start(); poolBlockPlacing.start(); }
日志中发现的异常信息
在两种方案的运行日志里,我都频繁看到以下GC和主线程过载的信息,不确定这是不是导致音频问题的根源:
Background concurrent mark compact GC freed 7706KB AllocSpace bytes, 0(0B) LOS objects, 49% free, 7460KB/14MB, paused 196us,5.570ms total 29.703ms
I/m.example.basic(22759): Background concurrent mark compact GC freed 6834KB AllocSpace bytes, 0(0B) LOS objects, 49% free, 7850KB/15MB, paused 106us,5.400ms total 28.545ms
I/Choreographer(22759): Skipped 99 frames! The application may be doing too much work on its main thread.
I/Choreographer(22759): Skipped 112 frames! The application may be doing too much work on its main thread.
想请教的问题
- 日志里的GC频繁触发和主线程丢帧,是否是导致音频播放异常的直接原因?
- 针对这种音效卡顿、延迟甚至停止的问题,还有什么其他排查或解决的思路吗?




