2012-04-16 29 views
6

Actualmente estoy enfrentando un problema con mi juego para Android. Normalmente cuando se llama a SoundPool.play(), la función necesita aproximadamente 0,003 segundos para finalizar, pero a veces se necesitan 0,2 segundos, lo que hace que mi juego tartamudee. ¿De dónde podría venir su anomalía?Android SoundPool.play() a veces se queda atrás

+0

Que nos muestra algo de código podría ser de alguna ayuda. Sin saber nada sobre tu juego, tengo la corazonada de que probablemente esté relacionado con el hilo. – Aidanc

+0

Bueno, de alguna manera es un código complejo, ¿qué quieres ver? –

+0

¿Cómo maneja el enhebrado en la aplicación? – Aidanc

Respuesta

5

Gracias a Tim, utilizar un hilo para jugar pareció solucionar el problema con éxito.

Tema

package org.racenet.racesow.threads; 

import java.util.concurrent.BlockingQueue; 
import java.util.concurrent.LinkedBlockingQueue; 

import org.racenet.racesow.models.SoundItem; 

import android.media.SoundPool; 

/** 
* Thread for playing sounds 
* 
* @author soh#zolex 
* 
*/ 
public class SoundThread extends Thread { 

    private SoundPool soundPool; 
    public BlockingQueue<SoundItem> sounds = new LinkedBlockingQueue<SoundItem>(); 
    public boolean stop = false; 

    /** 
    * Constructor 
    * 
    * @param soundPool 
    */ 
    public SoundThread(SoundPool soundPool) { 

     this.soundPool = soundPool; 
    } 

    /** 
    * Dispose a sound 
    * 
    * @param soundID 
    */ 
    public void unloadSound(int soundID) { 

     this.soundPool.unload(soundID); 
    } 

    @Override 
    /** 
    * Wait for sounds to play 
    */ 
    public void run() {   

     try { 

      SoundItem item; 
      while (!this.stop) { 

       item = this.sounds.take(); 
       if (item.stop) { 

        this.stop = true; 
        break; 
       } 

       this.soundPool.play(item.soundID, item.volume, item.volume, 0, 0, 1); 
      } 

     } catch (InterruptedException e) {} 
    } 
} 

SoundItem

package org.racenet.racesow.models; 

/** 
* SoundItem will be passed to the SoundThread which 
* will handle the playing of sounds 
* 
* @author soh#zolex 
* 
*/ 
public class SoundItem { 

    public soundID; 
    public volume; 
    public stop = false; 

    /** 
    * Default constructor 
    * 
    * @param soundID 
    * @param volume 
    */ 
    public SoundItem(int soundID, float volume) { 

     this.soundID = soundID; 
     this.volume = volume; 
    } 

    /** 
    * Constructor for the item 
    * which will kill the thread 
    * 
    * @param stop 
    */ 
    public SoundItem(boolean stop) { 

     this.stop = stop; 
    } 
} 
Cuestiones relacionadas