2011-09-15 43 views
6

Tôi nhận được lỗi này hàng trăm lần khi tôi chạy trong Debug, nó dường như không ảnh hưởng đến chương trình, nhưng làm cách nào để loại bỏ nó?tràn ngập âm thanh android heapsize

Tôi biết nó có thể được truy trở lại Soundpool dựa trên bài viết khác

09-ngày 15 tháng 9: 03: 09,190: ERROR/AudioCache (34): Heap kích thước tràn! kích thước req: 1052672, kích thước tối đa: 1048576

+0

Sau đó chỉ cần tăng kích thước heap của bạn – RoflcoptrException

+0

làm thế nào để làm điều đó? – GideonKain

+0

http://viralpatel.net/blogs/2009/01/jvm-java-increase-heap-size-setting-heap-size-jvm-heap.html – RoflcoptrException

Trả lời

0

Có thể tài nguyên phương tiện của bạn quá lớn để chơi với soundpool. Soundpool chỉ phát các hiệu ứng âm thanh ngắn. Trên Soundpool API không có đặc điểm kỹ thuật về mức tối đa của một tài nguyên để chơi với soundpool, nhưng nếu bạn sử dụng nó, chỉ phát các hiệu ứng âm thanh ngắn như, ví dụ, một vụ nổ ngắn trong trò chơi bắn súng. Nếu đây là vấn đề của bạn, Bạn nên sử dụng MediaPlayer để phát âm thanh của bạn.

10

SoundPool khó mã hóa kích thước bộ đệm là 1M cho tất cả các tệp được tải. Vì vậy, bạn có thể sẽ gặp lỗi tràn bộ nhớ heap khi bạn tải quá nhiều tệp vào SoundPool. Tôi cũng có vấn đề này về một dự án trò chơi sẽ tải FX âm thanh trò chơi vào SoundPool và giải pháp như sau:

  1. Phát nhạc nền dài/lớn trong MediaPlayer.
  2. Phát tệp âm thanh ngắn trong nhiều phiên bản SoundPool để ngăn lỗi heap. Các mẫu mã cho SoundPools đa:


/** 
    * Multi SoundPool to prevent memory error. 
    */ 
public class SoundPools {

private static final String TAG = "SoundPools"; private static final int MAX_STREAMS_PER_POOL = 15; private List<SoundPoolContainer> containers; public SoundPools() { containers = Collections.synchronizedList(new ArrayList<SoundPoolContainer>()); } public void loadSound(Context context, String id, String file) { Log.d(TAG, "SouldPools load sound " + file); try { for (SoundPoolContainer container : containers) { if (container.contains(id)) { return; } } for (SoundPoolContainer container : containers) { if (!container.isFull()) { container.load(context, id, file); return; } } SoundPoolContainer container = new SoundPoolContainer(); containers.add(container); container.load(context, id, file); } catch (Exception e) { Log.w(TAG, "Load sound error", e); } } public void playSound(Context context, String id, String file) { Log.d(TAG, "SouldPools play sound " + file); try { for (SoundPoolContainer container : containers) { if (container.contains(id)) { container.play(context, id, file); return; } } for (SoundPoolContainer container : containers) { if (!container.isFull()) { container.play(context, id, file); return; } } SoundPoolContainer container = new SoundPoolContainer(); containers.add(container); container.play(context, id, file); } catch (Exception e) { Log.w(TAG, "Play sound error", e); } } public void onPause() { for (SoundPoolContainer container : containers) { container.onPause(); } } public void onResume() { for (SoundPoolContainer container : containers) { container.onResume(); } } private static class SoundPoolContainer { SoundPool soundPool; Map<String, Integer> soundMap; AtomicInteger size; public SoundPoolContainer() { this.soundPool = new SoundPool(MAX_STREAMS_PER_POOL, android.media.AudioManager.STREAM_MUSIC, 0); this.soundMap = new ConcurrentHashMap<String, Integer>(MAX_STREAMS_PER_POOL); this.size = new AtomicInteger(0); } public void load(Context context, String id, String file) { try { this.size.incrementAndGet(); soundMap.put(id, soundPool.load(context.getAssets().openFd(file), 1)); } catch (Exception e) { this.size.decrementAndGet(); Log.w(TAG, "Load sound error", e); } } public void play(Context context, String id, String file) { android.media.AudioManager audioManager = (android.media.AudioManager) context .getSystemService(Context.AUDIO_SERVICE); final int streamVolume = audioManager.getStreamVolume(android.media.AudioManager.STREAM_MUSIC); Integer soundId = soundMap.get(id); if (soundId == null) { soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() { @Override public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { soundPool.play(sampleId, streamVolume, streamVolume, 1, 0, 1f); } }); try { this.size.incrementAndGet(); soundPool.load(context.getAssets().openFd(file), 1); } catch (IOException e) { this.size.decrementAndGet(); Log.w(TAG, "Load/Play sound error", e); } } else { try { soundPool.play(soundId, streamVolume, streamVolume, 1, 0, 1f); } catch (Exception e) { Log.w(TAG, "Play sound error", e); } } } public boolean contains(String id) { return soundMap.containsKey(id); } public boolean isFull() { return this.size.get() >= MAX_STREAMS_PER_POOL; } public void onPause() { try { soundPool.autoPause(); } catch (Exception e) { Log.w(TAG, "Pause SoundPool error", e); } } public void onResume() { try { soundPool.autoResume(); } catch (Exception e) { Log.w(TAG, "Resume SoundPool error", e); } } } }

Các vấn đề liên quan