2010-06-13 14 views
22

मेरे पास ऑडियो इंटरफ़ेस (प्रत्येक कॉल के लिए एक नया उदाहरण बनाने) का उपयोग करके किसी दिए गए ध्वनि को चलाने के लिए एक जेएस फ़ंक्शन है।जावास्क्रिप्ट बल जीसी संग्रह?/बलपूर्वक मुक्त वस्तु?

यह 32 वें कॉल (कभी-कभी कम) तक काफी अच्छा काम करता है। यह समस्या सीधे ऑडियो इंस्टेंस के रिलीज से संबंधित है। मुझे यह पता है क्योंकि मैंने क्रोमियम में जीसी के लिए समय की अनुमति दी है और यह मुझे एक और 32 या फिर ध्वनि चलाने की अनुमति देगा।

<html><head> 
<script type="text/javascript"> 
function playSound(url) { 
    var snd = new Audio(url); 
    snd.play(); 
    snd = null; 
} 
</script> 
</head> 

<body> 
<a href="#" onclick="playSound('blah.mp3');">Play sound</a> 
</body></html> 

मैं भी इस राशि है, जो पृष्ठों है कि कम से कम 32 playSound कॉल के लिए अच्छी तरह से काम करता है::

यहाँ मैं क्या कर रहा हूं, इसका एक उदाहरण

var AudioPlayer = { 
    cache: {}, 
    play: function(url) { 
     if (!AudioPlayer.cache[url]) 
      AudioPlayer.cache[url] = new Audio(url); 
     AudioPlayer.cache[url].play(); 
    } 
}; 

लेकिन यह नहीं होगा मैं जो करना चाहता हूं उसके लिए काम करें (गतिशील रूप से अन्य सामग्री (अलग-अलग फाइलों से) के साथ एक div को प्रतिस्थापित करें, जिन पर उन पर और भी आवाज है - 1. मेमोरी उपयोग आसानी से बढ़ जाएगा, 2. कई आवाज़ें कभी नहीं खेलेंगी)।

मुझे तुरंत ध्वनि जारी करने का एक तरीका चाहिए। क्या इसे करना संभव है? मुझे ऑडियो इंटरफ़ेस के लिए कोई खाली/बंद/अनलोड विधि नहीं मिली है।

पृष्ठों को स्थानीय रूप से देखा जाएगा, इसलिए ध्वनि की निरंतर लोडिंग बिल्कुल एक बड़ा कारक नहीं है (और अधिकांश ध्वनियां कम हैं)।

उत्तर

15

यह एक संपूर्ण जवाब नहीं है, लेकिन सवाल का "वहाँ कचरा संग्रहण करने के लिए क्रोम js इंजन मजबूर करने के लिए कोई तरीका है?", a chromium.org guy replied:

सामान्य में, नहीं, डिजाइन द्वारा। परीक्षण उद्देश्यों के लिए कचरा संग्रह को मजबूर करने के लिए जावास्क्रिप्ट कमांड "window.gc()" को सक्षम करने के लिए कमांड लाइन पर पास करने के लिए एक ध्वज है।

--js-flags '--expose_gc'


अद्यतन: लेकिन, जैसा कि @plash नीचे एक टिप्पणी में बताया गया है, इस ध्वज केवल डिबग बनाता है में काम करेंगे।

+0

Greeaat। मुझे इस प्रोजेक्ट के लिए क्रोमियम लॉन्च करने के लिए एक स्क्रिप्ट का उपयोग शुरू करना होगा (पहले से ही - फाइल-एक्सेस-इन-फाइलों का उपयोग करना ताकि मैं स्थानीय फाइल सिस्टम से फाइलें खोल सकूं)। संपादित करें: मैं इसे अंतिम उपाय मानता हूं। – komiga

+0

@plash: यह सुनिश्चित करना सुनिश्चित करें कि [जिस पोस्ट से मैंने लिंक किया है] (https://groups.google.com/group/chromium-extensions/browse_thread/thread/5dc4be46e434116a?pli=1), क्योंकि मैंने उद्धृत प्रतिक्रिया और जानकारी थी जो प्रासंगिक हो सकती है। मैंने व्यक्तिगत रूप से इसका परीक्षण नहीं किया। –

+1

यह गैर-डीबग बिल्ड में काम नहीं करता है। बस कोशिश की। – komiga

18

मैं कम से कम एक (या दो) खामियों देखें:

snd = new Audio(url); 

उसके सामने कोई var है, तो snd वैश्विक क्षेत्र को सौंपा गया है। आमतौर पर यह वही नहीं है जो आप चाहते हैं: यह वैश्विक नाम स्थान को अव्यवस्थित करता है और यदि कोई अन्य स्क्रिप्ट (उदाहरण के लिए, एक एक्सटेंशन) आकस्मिक रूप से snd का उपयोग करती है, तो चीजें एक गड़बड़ी होगी।

और वह भी इसलिए

delete snd; 

काम नहीं करता है: आप कर सकते हैं नहीं delete global variables:

जब घोषित चर और कार्यों एक चर वस्तु के गुणों बन - या तो सक्रियण वस्तु ( फ़ंक्शन कोड), या वैश्विक ऑब्जेक्ट ( वैश्विक कोड के लिए), ये गुण डोंटडेलेट विशेषता के साथ बनाए गए हैं

तो, का उपयोग

var snd = new Audio(url); 

बजाय। बीटीडब्ल्यू, आप जावास्क्रिप्ट इंजन को कचरा संग्रह करने के लिए मजबूर नहीं कर सकते हैं।

+0

आह, वह। मैं कुछ समय पहले परीक्षण नहीं कर रहा था जिसने मुझे var को हटा दिया था। यह मूल रूप से वहां था। संपादित करें: ठीक किया गया। – komiga

+0

@plash: ठीक है, लेकिन मैं अपना जवाब यहां छोड़ दूंगा क्योंकि यह अन्य उपयोगकर्ताओं के लिए उपयोगी हो सकता है। –

+1

यह सच नहीं है! आप 'window.snd' हटाएं' के माध्यम से वैश्विक चर हटा सकते हैं; – Adaptabi

2

बस इसे हटाने और इसे शून्य करने के लिए सेट करना मेरे लिए काम नहीं करता था, इसलिए मैंने एक कामकाज किया।

मुझे यह एक ही समय में एक से अधिक ध्वनि के लिए काम कर रहा है। उदाहरणों को जारी करने के लिए, प्रत्येक ध्वनि को ऑब्जेक्ट टैग होना चाहिए। गतिशील रूप से, प्रत्येक ऑब्जेक्ट टैग (ध्वनि) को एक div में संलग्न करें। उदाहरण को रिलीज़ करने के लिए, Div से ऑब्जेक्ट टैग (ध्वनि) को गतिशील रूप से हटा दें।

I अनुमान यह काम करता है क्योंकि ब्राउज़र आमतौर पर प्रत्येक टैग को किसी प्रकार की वस्तु के रूप में लागू करता है। इसलिए, जब मैं एक टैग हटा देता हूं, तो आंतरिक ऑब्जेक्ट हटा दिया जाता है और इसके साथ जुड़े किसी भी संसाधन को रिलीज़ करता है।

<!--HTML: This will contains object sounds--> 
<Div id="sounds"></Div> 

//Javacript, using jQuery 
//Create and play an MP3 
var id_event = 1234; //Keep and incrementing a counter might do, I use an Event Id from my app. 
var objSound = "<object width='1' height='1' id='AUDIOIE" + id_event 
     + " type='application/x-oleobject' AND_MORE_PARAMS_TO_PLAY_A_MP3" 
     + "/>"; 
$(objSound).appendTo('#sounds'); 

पूर्ण ऑब्जेक्ट पैराम्स के लिए here पर जाएं।

//To Stop an MP3 and release it instance. 
$('#AUDIOIE' + id_event).empty().remove(); 
+0

बस शुद्धता के लिए: वे "ऑब्जेक्ट टैग" हैं बल्कि [ऑब्जेक्ट तत्व] (http://www.w3.org/TR/html401/struct/objects.html#edef-OBJECT)। कृपया [टैग और तत्व] भ्रमित न करें (http://perfectionkills.com/tag-is-not-an-element-or-is-it/)! –

संबंधित मुद्दे