0

我编写了一个单元有 3 个音频阶段的 Android 游戏:

  • 被击中
  • 攻击
  • 死的

所以我在我的单元对象中添加了以下代码:

    MediaPlayer mMediaPlayerGetHit = null;
    MediaPlayer mMediaPlayerDead = null;
    MediaPlayer mMediaPlayerAttack = null;

constructor

  mMediaPlayerAttack=MediaPlayer.create(context,R.raw.fly_monster_attack1);
  mMediaPlayerDead=MediaPlayer.create(context,R.raw.fly_monster_death1);
  mMediaPlayerGetHit=MediaPlayer.create(context,R.raw.fly_monster_gethit1);

  mMediaPlayerAttack.setOnPreparedListener(this);
  mMediaPlayerDead.setOnPreparedListener(this);
  mMediaPlayerGetHit.setOnPreparedListener(this);

  ....

现在好像乱七八糟了

嗯,3 个玩家对象,每个单位状态一个。

我确定它的方式是错误的,我需要更改MediaPlayer有关单元状态的每个时间源,

但是性能问题来了:

可以说我MediaPlayer已经获取了资源attack

之后,我将其切换为get hit,再次切换为attack

也许我需要以某种方式保存实例MediaPlayer并重attack用它?

我没有看到它的好方法数百次切换我的穷人MediaPlayer

有任何想法吗?

谢谢,

4

2 回答 2

4

你应该看看 SoundPool 类,我认为它更适合你想要做的事情,这是一个如何使用它的好例子:

http://www.edumobile.org/android/android-programming-tutorials/sound-pool-example-in-android-development/

SoundPool 非常适合游戏,我已经在我的游戏中使用过它并且效果很好,该类允许您轻松地同时循环、播放和停止多个声音,而无需为每个动作创建一个 MediaPlayer,您需要担心的是完成后释放池。此外,根据您的操作,它有一个非常有效的优先级系统,允许您设置要播放的最大声音量,并根据优先级让另一个声音继续播放并在插入新声音时占用另一个声音的资源......

文档:

优先级从低到高,即数字越大优先级越高。当调用 play() 会导致活动流的数量超过创建 SoundPool 时 maxStreams 参数建立的值时,使用优先级。在这种情况下,流分配器将停止最低优先级的流。如果有多个具有相同低优先级的流,它将选择最旧的流停止。在新流的优先级低于所有活动流的情况下,新声音将不会播放,并且 play() 函数将返回流 ID 为零。

问候!

于 2013-07-11T18:55:30.603 回答
4

对于像这样的简短声音片段,您应该真正考虑使用SoundPool而不是 MediaPlayer,尽管它使用 MP 来解码音频..它是为低延迟流设计的,并允许同时多个流。

除了低延迟播放之外,SoundPool 还可以管理一次渲染的音频流的数量。构造 SoundPool 对象时,maxStreams 参数设置可以从该单个 SoundPool 一次播放的最大流数。SoundPool 跟踪活动流的数量。如果超过最大流数,SoundPool 将首先根据优先级自动停止先前播放的流,然后根据该优先级内的年龄。限制最大流数有助于限制 CPU 负载并降低音频混合影响视觉或 UI 性能的可能性。

因此,对于需要一次渲染多个声音的游戏,SoundPool 可能是理想的选择。

于 2013-07-11T18:55:39.390 回答