2009-06-12 13 views
7

मैं एक जावास्क्रिप्ट टावर रक्षा प्रोग्राम शुरू कर रहा हूं; अब तक मेरे पास एक प्रक्षेपवक्र पर minions का आंदोलन है। लेकिन मुझे एक बहुत बड़ी परेशानी है, खेल अचानक कुछ सेकंड के लिए जमा हो जाता है। मैं अनुमान लगा रहा हूं कि कचरा कलेक्टर अपनी नौकरी कर रहा है, इस पर कोई विचार है कि मैं इसे कैसे हल कर सकता हूं, यह बहुत अच्छा होगा क्योंकि मैं गेम में बहुत सारे तत्व जोड़ने की योजना बना रहा हूं और जब तक मुझे प्राप्त नहीं होता तब तक मैं कोडिंग नहीं रखना चाहता यह पूरी तरह बहती है!जावास्क्रिप्ट गेम; धीमा और ठंडा! इसे कैसे हल करें?

अब तक कोड बहुत आसान है; आप इसे बाहर here

जांच कर सकते हैं कोड यह रहा:

<html> 
<head> 
    <style> 
     #game{ 
      background:red; 
      width:500px;    
      height:500px;   
      position:relative;   
     } 
     .mostro { 
      background:black; 
      width:15px;   
      height:15px;    
      position:absolute;   
     } 
    </style> 
</head> 
<body> 
<div id="game"> 
<script type="text/javascript"> 
waypoint_x = [40, 140, 140, 220, 220, 80, 80, 340, 340, 420, 420]; 
waypoint_y = [140, 140, 60, 60, 240, 240, 320, 320, 100, 100, -20]; 
delay = 25; 
new_monster = 0; 
monsters_placed = 0; 
monsters = []; 
var d = new Date(); 
dist_x = 0; 
dist_y = 0; 
angle = 0; 
mostro=""; 
total_monsters = 5; 
function runGame() { 
    if (monsters_placed<total_monsters) { 
     new_monster++; 
    } 
    if (new_monster == delay) { 
     new_monster = 0; 
     document.getElementById("game").innerHTML = document.getElementById("game").innerHTML + '<div class="mostro" id="mostro-'+monsters_placed+'"></div>'; 
     monsters_placed++; 
    } 
    for (i=0;i<monsters_placed;i=i+1) { 
      mostro = monsters[i]; 
      dist_x = waypoint_x[mostro.point_to_reach] - mostro._x; 
      dist_y = waypoint_y[mostro.point_to_reach] - mostro._y; 
      if ((Math.abs(dist_x) + Math.abs(dist_y)) < 1) { 
       monsters[i].point_to_reach++; 
      } 
      angle = Math.atan2(dist_y, dist_x); 
      mostro._x = mostro._x + mostro.speed * Math.cos(angle); 
      mostro._y = mostro._y + mostro.speed * Math.sin(angle); 
      monsters[i]._rotation = angle/Math.PI*180-90  
     document.getElementById("mostro-"+i).style.left = Math.ceil(mostro._x) + "px"; 
     document.getElementById("mostro-"+i).style.top = Math.ceil(mostro._y) + "px"; 
    } 
} 

function setUpGame(){ 
    for(i=0;i<=total_monsters;i++){ 
     monsters[i] = new Object(); 
     monsters[i].point_to_reach = 0; 
     monsters[i].speed = 1; 
     monsters[i]._x = 0; 
     monsters[i]._y = 0; 
    } 
} 
setUpGame(); 
setInterval(runGame,10); 
</script> 
</body> 
</html> 
+0

क्या आपने अंतराल को 30 की तरह कुछ बढ़ाने की कोशिश की? – cloudhead

+0

हां यह 1000 के – DFectuoso

उत्तर

2

इसकी नहीं कचरा कलेक्टर काम कर लेकिन अपने कोड में जब आप शीर्ष और बाएं पदों सेट करने का प्रयास, एक particuar समय मूल्य पर कि आप एक संख्या में सेट करने की कोशिश नहीं करते हैं। तो कोड तोड़ता है ....

मुझे लगता है कि यह तब होता है जब चलती div लाल पृष्ठभूमि के साथ कंटेनर के शीर्ष को पार करती है।

+0

में अंतराल के साथ भी होता है, यह पृष्ठभूमि से बाहर निकलने से पहले होता है। मैं बाएं और दाएं घोषणा में दशमलव बिंदुओं के बारे में सोच रहा था; मुझे इसे – DFectuoso

+0

देखें, यह गेम बहुत अच्छा है .... – rahul

+0

यह भी आईई 7 में जांचें। यह एक स्क्रिप्ट त्रुटि उत्पन्न करता है। – rahul

2

हाँ, यह सही है: देरी इसलिए है क्योंकि जब बहुत से राक्षस होते हैं, तो बहुत से स्थिति अपडेट किए जाने की आवश्यकता होती है। इससे "redraw" देरी हो जाती है ..

मुझे लगता है कि प्रत्येक राक्षस के लिए एक डोम तत्व है (जैसा मामला होना चाहिए)। लेकिन, आप अपनी स्थिति एक-एक करके अपडेट कर रहे हैं।

एक बेहतर stategy सामूहिक रूप से अपनी स्थिति को अद्यतन करने के लिए सबसे पहले, यह होगा:

<div id='monster-container'> 
    <div id='monstser-1'></div> 
    <div id='monstser-2'></div> 
    <div id='monstser-3'></div> 
</div> 

तो '# राक्षस-कंटेनर' जब राक्षसों की स्थिति को अद्यतन

युक्तियाँ इस अंतराल को कम करने चलते हैं। इस तरह से redraw समय निश्चित रूप से कम किया जाएगा। मैं जो कहता हूं वह आपके खेल की एक प्राचीन समझ से है। राक्षसों के मार्ग के आधार पर आपको इस दृष्टिकोण को संशोधित करने की आवश्यकता हो सकती है। मेरा दृष्टिकोण सीधे तभी काम करेगा जब राक्षस केवल सीधी रेखा में चले जाएंगे।

  • दूसरे, अगर आप img का उपयोग कर रहे हैं राक्षसों के लिए, div के उपयोग पर विचार करें, और div की पृष्ठभूमि के रूप में छवियों को निर्धारित किया है। इसने मेरे कई पालतू खेलों में तेजी से प्रदर्शन किया है।

  • तीसरा, यदि आप राक्षसों के लिए अलग-अलग छवियों का उपयोग कर रहे हैं, तो एक समग्र छवि और सीएसएस स्प्राइटिंग का उपयोग करने पर विचार करें।

आप अपने गेम के साथ भाग्य चाहते हैं! चीयर्स !!

jrh

+0

हाँ; लेकिन मुझे गेम को जिस तरह से करने की ज़रूरत है, उसे बनाने के लिए मुझे उन्हें एक-एक करके स्थानांतरित करने की आवश्यकता है। अन्य युक्तियों के लिए धन्यवाद! – DFectuoso

+0

जो आसानी से किया जाता है: उन्हें अपने कंटेनर div के संबंध में ले जाएं! मैंने वास्तव में इन्हें पहले सामना किया है ... और यदि आप वास्तव में एक गहन खेल बनाना चाहते हैं, तो का उपयोग करें। असल में, divs और imgs को ले जाने के बारे में केवल आपको ही मिल जाएगा। – jrharshath

+0

एक अच्छा विचार है ... हमम हमम – DFectuoso

1

हां, यह निश्चित रूप से एक कचरा कलेक्टर है। मैं खुद एक जावास्क्रिप्ट गेम विकसित कर रहा हूं, और मैंने पिछले कुछ दिनों में इस समस्या से छुटकारा पाने की कोशिश की। अब तक मैं कह सकता हूं कि यह असंभव है।

हालांकि, मुझे यह ध्यान रखना होगा कि विभिन्न ब्राउज़रों के पास अलग कचरा कलेक्टर हैं, और उदाहरण के लिए, सफारी 4 में, आपका उदाहरण पूरी तरह चिकनी है।क्योंकि आपके उदाहरण में भी Reducing freezing with Object Pooling

ईमानदारी से, मुझे लगता है, कि तकनीक है कि आलेख में वर्णित, बहुत उपयोगी नहीं है, कि किसी भी चर होने की जरूरत नहीं है:

और यहाँ इस विषय पर दिलचस्प लिंक है मंजूरी दे दी, ठंड वास्तव में ध्यान देने योग्य है।

इसके अलावा मैंने आपके उदाहरण को फिर से लिखा है, यह जांचने के लिए कि वैश्विक चर प्रदर्शन ने बर्बाद कर दिया है या नहीं। You can see the difference yourself

+0

अपने उत्तर को सही के रूप में नहीं चुनते क्योंकि यह समस्या का समाधान नहीं करता है, लेकिन आप रॉक! आदमी !, महान जवाब, अच्छी सामग्री, समस्या की समझ और निश्चित रूप से उपयोगी !!! – DFectuoso

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