You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flame(Flutter)游戏中音频播放异常(卡顿、延迟、停止)的问题求助

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.

想请教的问题

  1. 日志里的GC频繁触发和主线程丢帧,是否是导致音频播放异常的直接原因?
  2. 针对这种音效卡顿、延迟甚至停止的问题,还有什么其他排查或解决的思路吗?

火山引擎 最新活动