Премахване на 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 за музика - това води до зареждане на цялата песен в RAM некомпресирана - което изяжда много място в сравнение с поточно предаване на MP3/WMA от диск с помощта на Музика.

Ако искате да изхвърлите цялото съдържание, тогава трябва да разтоварите ContentManager, който има цялото ви съдържание. След това можете да пресъздадете съдържанието - ще отнеме известно време, за да го заредите отново от диска, но ще имате чист набор от съдържание, ако това е, което търсите. Имайте предвид, че SoundEffectInstance съдържа неуправляеми ресурси, така че единственият начин да го „премахнете“ е да го изхвърлите или да разтоварите неговия ContentManager.

Ако не искате да направите това, тогава трябва да запазите препратките към вашето съдържание и след това можете ръчно да правите неща като спиране:

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, който можете да кажете if X се случва след това mediaplayer.play() else mediaplayer.stop(); или mediaplayer.pause()

person koss    schedule 20.11.2014