SoundPool play() 块渲染

Posted

技术标签:

【中文标题】SoundPool play() 块渲染【英文标题】:SoundPool play() blocks render 【发布时间】:2016-11-11 18:54:52 【问题描述】:

我正在使用 SoundPool 在我正在创建的街机游戏中播放声音。然而playPassSound() 从开始到结束大约需要 40 毫秒。我只构建了 1x SoundPlayer,它只加载所有的声音一次。我在我的游戏线程中调用playPassSound(),它也处理渲染调用。

这就是我的 SoundPlayer 类的样子(只是对与声音相关的所有内容的封装):

public class SoundPlayer 

private AudioAttributes audioAttributes;
private final int SOUND_POOL_MAX = 2;
private AudioManager audioManager;
private SoundPool soundPool;
private int soundIdPass;
private float volume;
private boolean passLoaded;

public SoundPlayer(Context context)

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)

        audioAttributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_GAME)
                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                .build();
        soundPool = new SoundPool.Builder()
                .setAudioAttributes(audioAttributes)
                .setMaxStreams(SOUND_POOL_MAX)
                .build();

    else 
        //SoundPool is deprecated as of API Level 21 (Lollipop)
        soundPool = new SoundPool(SOUND_POOL_MAX, AudioManager.STREAM_MUSIC, 0);
    

    audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

    soundIdPass = soundPool.load(context, R.raw.pass, 1);

    soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() 
        @Override
        public void onLoadComplete(SoundPool soundPool, int sampleId, int status) 

            if(sampleId == soundIdPass)
                passLoaded = true;
        
    );


public void playPassSound()
    controlVolume();
    soundPool.play(soundIdPass, volume, volume, 1, 0, 1f);

 public void controlVolume()
    float actualVolume = (float) audioManager
            .getStreamVolume(AudioManager.STREAM_MUSIC);
    float maxVolume = (float) audioManager
            .getStreamMaxVolume(AudioManager.STREAM_MUSIC);
    volume = actualVolume / maxVolume;

为什么playPassSound()需要这么长时间?如何将它与我的游戏/渲染线程分离,以便游戏不受它的影响?

【问题讨论】:

【参考方案1】:

只需改用 Mediaplayer...不要费心调试它。这个问题似乎没有任何真正的解决方案。只有this hack。

【讨论】:

以上是关于SoundPool play() 块渲染的主要内容,如果未能解决你的问题,请参考以下文章

SoundPool 减慢应用程序

SoundPool 停止功能未停止

Android SoundPool.play() 有时会滞后

单击按钮时如何发出随机声音?

AS3 Sound.Play(starttime) 奇怪的延迟

SoundPool 加载缓慢,MotionEvent 很奇怪