2010-04-28 6 views
2

Je suis en train de faire un simulateur basique d'orbite en utilisant Raphael JS, où je dessine un cercle comme "étoile" et un autre cercle comme "planète". Il semble fonctionner correctement, avec le seul hic que la simulation continue, son framerate ralentit progressivement jusqu'à ce que le mouvement orbital n'apparaisse plus fluide. Voici le code (note: utilise uniquement jQuery pour initialiser la page):Pourquoi le framerate de Raphael ralentit-il sur ce code?

$(function() { 
    var paper = Raphael(document.getElementById('canvas'), 640, 480); 
    var star = paper.circle(320, 240, 10); 
    var planet = paper.circle(320, 150, 5); 
    var starVelocity = [0,0]; 
    var planetVelocity = [20.42,0]; 
    var starMass = 3.08e22; 
    var planetMass = 3.303e26; 
    var gravConstant = 1.034e-18; 
    function calculateOrbit() { 
     var accx = 0; 
     var accy = 0; 
     accx = (gravConstant * starMass * ((star.attr('cx') - planet.attr('cx'))))/(Math.pow(circleDistance(), 3)); 
     accy = (gravConstant * starMass * ((star.attr('cy') - planet.attr('cy'))))/(Math.pow(circleDistance(), 3)); 
     planetVelocity[0] += accx; 
     planetVelocity[1] += accy; 
     planet.animate({cx: planet.attr('cx') + planetVelocity[0], cy: planet.attr('cy') + planetVelocity[1]}, 150, calculateOrbit); 
     paper.circle(planet.attr('cx'), planet.attr('cy'), 1); // added to 'trace' orbit 
    } 
    function circleDistance() { 
     return (Math.sqrt(Math.pow(star.attr('cx') - planet.attr('cx'), 2) + Math.pow(star.attr('cy') - planet.attr('cy'), 2))); 
    } 
    calculateOrbit(); 
}); 

Il ne semble pas, pour moi en tout cas, que toute partie de ce code entraînerait l'animation de ralentir progressivement à une exploration, donc toute aide pour résoudre le problème sera appréciée!

+0

Je suis arrivé à cette question recherche d'une réponse pourquoi mon petit widget raphael est allé horriblement lent quand je ne change pas vraiment quoi que ce soit en elle. J'ai seulement branché jQuery et utilisé des sélecteurs jQuery au lieu des appels document.getElementById() pour accéder à des parties de widget individuelles. Il me semble que jQuery peut sérieusement ralentir les choses lorsqu'il est combiné avec Raphael. –

+0

Vous pouvez améliorer cela maintenant en utilisant l'objet 'eve' ajouté dans Raphael, vous pouvez ensuite obtenir une mise à jour à chaque image, et y faire vos calculs, donc je ferais appel à planet.animate une fois avec une autre fonction faisant les calculs. – Neil

Répondre

3

Le problème est avec l'appel de calculateOrbit dans votre appel planet.animate(). Il n'est pas manipulé correctement par raphael et provoque une fuite de mémoire ou une exécution ralentie. si vous supprimez et remplacez la ligne

calculateOrbit() 

avec

setInterval(calculateOrbit, 150); 

il doit fonctionner en douceur.

code complet:

$(function() { 
var paper = Raphael(document.getElementById('canvas'), 640, 480); 
var star = paper.circle(320, 240, 10); 
var planet = paper.circle(320, 150, 5); 
var starVelocity = [0,0]; 
var planetVelocity = [20.42,0]; 
var starMass = 3.08e22; 
var planetMass = 3.303e26; 
var gravConstant = 1.034e-18; 
function calculateOrbit() { 
    var accx = 0; 
    var accy = 0; 
    accx = (gravConstant * starMass * ((star.attr('cx') - planet.attr('cx'))))/(Math.pow(circleDistance(), 3)); 
    accy = (gravConstant * starMass * ((star.attr('cy') - planet.attr('cy'))))/(Math.pow(circleDistance(), 3)); 
    planetVelocity[0] += accx; 
    planetVelocity[1] += accy; 
    planet.animate({cx: planet.attr('cx') + planetVelocity[0], cy: planet.attr('cy') + planetVelocity[1]}, 150); 
    paper.circle(planet.attr('cx'), planet.attr('cy'), 1); // added to 'trace' orbit 
} 
function circleDistance() { 
    return (Math.sqrt(Math.pow(star.attr('cx') - planet.attr('cx'), 2) + Math.pow(star.attr('cy') - planet.attr('cy'), 2))); 
} 
setInterval(calculateOrbit, 150); 
}); 
+2

J'ai un problème similaire et je voudrais essayer cette solution. Puis-je demander, d'où vient 150 ms dans votre appel à setInterval? – Doug

Questions connexes