Удаление экземпляра SoundEffectInstance без использования команды dispose в C# XNA

Я столкнулся с небольшой проблемой. Когда я перезапускаю игру (запустив собственный метод инициализации), я могу успешно перезагрузить все свои объекты/переменные. Но исходный SoundEffectInstance, который я использовал, продолжает воспроизводиться, пока создается новый экземпляр. Это приводит к одновременному воспроизведению нескольких экземпляров одной и той же музыки.

То, чего я пытаюсь достичь, - это способ избавиться от первого экземпляра при создании нового.

instance.Dispose(); нельзя использовать, так как это означает, что я не могу повторно инициализировать звук.

Я попытался использовать список, чтобы решить эту проблему (удаление экземпляров перед перезапуском игры), но, похоже, я не могу CreateInstance() из списка, что ограничивает меня от инициализации звука для начала.

Массивы, похоже, тоже не предлагают решения. Любые идеи?


person meestaman    schedule 18.11.2014    source источник
comment
Как насчет полной остановки и удаления экземпляра звукового эффекта путем повторного его создания при перезапуске игры? Таким образом, по прошествии X времени сборщик мусора придет и заберет его, и это больше не будет проблемой.   -  person Falgantil    schedule 19.11.2014
comment
@Bjarke: Полностью отказываясь от него, вы имеете в виду dispose() его? Или вы имеете в виду использование метода unloadcontent()?   -  person meestaman    schedule 19.11.2014


Ответы (2)


Во-первых, вам, вероятно, не следует использовать SoundEffectInstance для музыки — это приводит к тому, что вся песня загружается в ОЗУ в несжатом виде, что занимает массу места по сравнению с потоковой передачей MP3/WMA с диска с помощью Music.

Если вы хотите удалить весь контент, вам следует выгрузить ContentManager, в котором есть весь ваш контент. Затем вы можете воссоздать контент — повторная загрузка его с диска займет некоторое время, но у вас будет чистый набор контента, если это то, что вам нужно. Имейте в виду, что SoundEffectInstance содержит неуправляемые ресурсы, поэтому единственный способ «удалить» его — избавиться от него или выгрузить его ContentManager.

Если вы не хотите этого делать, вы должны сохранить ссылки на свой контент, а затем вы можете вручную делать такие вещи, как stop:

http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.audio.soundeffectinstance.stop.aspx

person Victor Chelaru    schedule 19.11.2014

Вы должны использовать mediaplayer.play() для воспроизведения песни вместо SoundEffectInstance, а затем вы можете просто иметь оператор if, который вы можете сказать, если X происходит тогда mediaplayer.play() else mediaplayer.stop(); или mediaplayer.pause()

person koss    schedule 20.11.2014