Удаление SoundEffectInstance без использования "dispose" в C# XNA
Я столкнулся с небольшой проблемой. Когда я перезапускаю свою игру (запустив собственный метод инициализации), я могу успешно перезагрузить все мои объекты / переменные. Но начальный SoundEffectInstance
Я использовал продолжает играть, пока создается новый экземпляр. Это приводит к тому, что несколько экземпляров одной и той же музыки воспроизводятся одновременно.
То, чего я пытаюсь добиться, - это способ избавиться от первого экземпляра при создании нового.
instance.Dispose();
не может использоваться, поскольку это означает, что я не могу повторно инициализировать звук.
Я попытался использовать список, чтобы решить эту проблему (удаление экземпляров перед перезапуском игры), но, похоже, я не могу CreateInstance()
из списка, ограничивая меня от инициализации звука для начала.
Массивы тоже не предлагают решения. Есть идеи?
2 ответа
Во-первых, вам, вероятно, не следует использовать SoundEffectInstance для музыки - это приводит к тому, что вся песня загружается в ОЗУ без сжатия - что потребляет массу места относительно потоковой передачи MP3/WMA с диска с использованием музыки.
Если вы хотите удалить весь контент, вы должны выгрузить ContentManager, в котором есть весь ваш контент. Затем вы можете воссоздать контент - потребуется некоторое время для его повторной загрузки с диска, но у вас будет чистый набор контента, если это то, что вам нужно. Помните, что SoundEffectInstance содержит неуправляемые ресурсы, поэтому единственный способ "удалить" его - это удалить его или выгрузить его ContentManager.
Если вы не хотите этого делать, вам следует сохранить ссылки на ваш контент, а затем вы можете вручную выполнить такие действия, как остановка:
http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.audio.soundeffectinstance.stop.aspx
Вы должны использовать mediaplayer.play() для воспроизведения песни вместо SoundEffectInstance, и тогда вы можете просто иметь оператор if, который вы можете сказать, если X случится, то mediaplayer.play() else mediaplayer.stop (); или mediaplayer.pause()