2012-12-17 14 views
12

मेरे पास बहुत सारे मेष और मॉर्फएनिममेश के साथ एक बड़ा दृश्य है। मैश हटा दिए जाने पर मैं स्मृति मुक्त करना चाहता हूं।तीन जेएस मेमोरी प्रबंधन

for (var i = scene.children.length - 1; i >= 0 ; i --) { 
    var obj = scene.children[i]; 
    scene.remove(obj); 
    obj.deallocate(); 
    obj.geometry.deallocate(); 
    obj.material.deallocate(); 
    obj.material.map.deallocate(); 
} 

अगर मैं इस के बाद कार्य प्रबंधक पर स्मृति के उपयोग की जाँच करें, कुछ भी नहीं बदलता है: अगर मुझे पता सही यह करने के लिए सबसे अच्छा तरीका है। (जीसी के लिए कुछ मिनट इंतजार करने की कोशिश की लेकिन कुछ भी नहीं।) Google क्रोम मेमोरी स्नैपशॉट ऑब्जेक्ट्स को अभी भी दिखाता है। तीनों में morphTargets। जीमेट्री @ 1862203 आदि

ओबीजे को शून्य पर सेट करने का प्रयास किया, लेकिन फिर भी कोई स्मृति कम नहीं हुई।

कोई विचार क्या मैं गलत कर रहा हूं?

यह स्तर के साथ एक गेम है और खिलाड़ी एक से दूसरे में बदल सकता है। कुछ बदलाव के बाद स्मृति उपयोग वास्तव में उच्च हो जाता है। मैं स्तर परिवर्तन से पहले स्मृति से सभी ऑब्जेक्ट को हटाना क्यों चाहता हूं।

उत्तर

-2

जावास्क्रिप्ट मेमोरी प्रबंधन पूरी तरह से ब्राउज़र द्वारा नियंत्रित किया जाता है। आप जीसी को चलाने के लिए मजबूर नहीं कर सकते हैं (और जब से यह बहुत अच्छी तरह अनुकूल है तब से आप सक्षम नहीं होना चाहिए)।

जीसी केवल उन वस्तुओं को नष्ट कर देगा जिनके पास अब उनका संदर्भ नहीं है; सेटिंग obj = null; वास्तव में ऑब्जेक्ट को नष्ट नहीं करता है, बल्कि यह ऑब्जेक्ट के संदर्भ को हटा देता है।

यदि आपके पास अन्य संदर्भ अभी भी खुले बंद हैं (या डीओएम संलग्न हैं) में, ब्राउज़र उस वस्तु को उनके लिए जीवित रखेगा।

आप perfection kills -- understanding delete पढ़ना चाहिए, और आप क्रोम का उपयोग कर रहे हैं, यह एक अच्छा उपकरण की तरह दिखता है: leak finder for javascript

10

सबसे अधिक संभावना है, तो आप कुछ या सभी को जोड़ने के लिए निम्न में से की जरूरत है:

geometry.dispose(); 
material.dispose(); 
texture.dispose(); 
इन उदाहरणों को बाहर

की जांच:

http://mrdoob.github.com/three.js/examples/webgl_test_memory.html

http://mrdoob.github.com/three.js/examples/webgl_test_memory2.html

Three.js r.60

+0

इस कोशिश कब्जा किया जा सकता है, लेकिन कुछ भी नहीं बदला। यदि मैं वस्तुओं को क्रोम में एक हीप स्नैपशॉट लेता हूं, सरणी (उदाहरण के लिए: तीन। जीमेट्री @ 1862203 में morphTargets) अभी भी वहां है और स्मृति उपयोग समान है। – user974250

+0

शायद आप कहीं जाल, बनावट या सामग्री के लिए एक रेफरी धारण कर रहे हैं? – Neil

+0

इन उदाहरणों के बारे में बात यह है कि वे बनावट शामिल नहीं करते हैं –

-1

मैं सभी निपटाने और पुनःआवंटन तरीकों का प्रयास किया लेकिन कुछ भी काम किया।

फिर मैंने अपने आयनिक एप्लिकेशन के लिए निम्नलिखित किया जो 360 छवि प्रस्तुत करने के लिए वेबलॉग रेंडरर का उपयोग कर रहा है।

this.renderer = new THREE.WebGLRenderer({ antialias: true }); 
RicohView.prototype.stopRendering = function() { 
    this.canRender = false; 
    this.renderer.forceContextLoss(); 
    this.renderer.dispose(); 
    console.log('renderer disposed'); 
    cancelAnimationFrame(this.requestId); 
} 

requestId कुछ जहाँ से

this.requestId = requestAnimationFrame(render); 
संबंधित मुद्दे