2010-10-30 6 views
2

J'ai créé mon premier jeu SVG en utilisant Raphaël.js.Optimiser le jeu SVG

Dans Chrome le jeu se sent rapide, mais dans d'autres navigateur comme IE (compréhensible car il utilise VML), Firefox, iPad safari et autres, il se sent parfois lent.

Je suis à la recherche de conseils pour optimiser mon code afin d'obtenir la meilleure performance absolue. J'ai fait de mon mieux pour l'optimiser, mais je ne suis qu'un débutant de JS. N'hésitez pas à mentionner si vous devriez utiliser les meilleures pratiques recommandées que je n'utilise pas. Où est-il probable que le goulot d'étranglement est? Vous pouvez voir le code et essayer le jeu au jsfiddle.

+0

Semble ne pas fonctionner dans Internet Explorer 8 et le dernier Google Chrome. –

+0

Réessayez, pense que je l'ai corrigé, ne semble pas non plus fonctionner dans Safari, quelque chose ne va pas avec les ressources gérées par jsfiddle. –

+0

Une optimisation peut être de passer à [ex] Canvas ;-) –

Répondre

3

réduire les appels de méthode

var left1 = a.attr('x'), 
left2 = b.attr('x'), 
right1 = a.attr('x') + a.attr('width'), 
right2 = b.attr('x') + b.attr('width'), 
top1 = a.attr('y'), 
top2 = b.attr('y'), 
bottom1 = a.attr('y') + a.attr('height'), 
bottom2 = b.attr('y') + b.attr('height'); 

pourrait être optimisé comme ceci:

var left1 = a.attr('x'), 
left2 = b.attr('x'), 
right1 = left1 + a.attr('width'), 
right2 = left2 + b.attr('width'), 
top1 = a.attr('y'), 
top2 = b.attr('y'), 
bottom1 = top1 + a.attr('height'), 
bottom2 = top2 + b.attr('height'); 

Cela vous permet d'économiser 4 appels de méthode par hitDetection appel. Il en va de même pour wallDetection et probablement d'autres fonctions. En fait, je crois aussi que les appels de largeur et de hauteur peuvent être supprimés et simplement mis en cache à travers une fermeture, puisque ceux-ci sont assez statiques après la création, voir l'exemple suivant.

également avec le bit suivant:

var animateEnemies = function(enemy) { 
    var enemyWidth = enemy.attr('width'), 
    enemyHeight = enemy.attr('height'), 
... 

Vous définissez la largeur et la hauteur des ennemis une fois, ils semblent assez constante, vous pouvez supprimer la .attr() recherche et passer la largeur et la hauteur du createEnemies appel ainsi que.

var animateEnemies = function(enemy , enemyWidth , enemyHeight) { 
    var animationDuration = getRandomInt(1000, 3000)/difficulty; 
    enemy.animate({ 
     x: getRandomInt(0, gameWidth - enemyWidth), 
     y: getRandomInt(0, gameHeight - enemyHeight) 
    }, animationDuration, "ease-in-out"); 
    // use setTimout instead of onAnimation callback, since it gave "too much recursion" in Firefox 3.6 
    this.timeOut = setTimeout(function() { 
     animateEnemies(enemy , enemyWidth , enemyHeight); 
    }, animationDuration); 
}; 

La réduction des appels de fonction et les variables de mise en cache peut aider beaucoup dans les navigateurs existants, alors que d'autres, le code semble assez soignée.

+0

Malheureusement, aucune de ces micro optimisations ne sera utile. – galambalazs

+0

@galambalaz Pour les navigateurs traditionnels comme IE, les micro-optimisations ne sont pas disponibles ... La réduction des appels de fonctions dans les fonctions souvent invoquées peut réellement améliorer considérablement les performances. Si cela résout entièrement le problème est peu probable, mais cela aidera. – BGerrissen

+1

Si le gain de performance est imperceptible, c'est l'optimisation micro. Les choses qui donnent quelque chose de mieux résultent en théorie et n'ont aucun effet dans une situation particulière. C'est pourquoi l'optimisation doit toujours aller de pair avec les tests. – galambalazs

3

Je ne veux pas sonner péniblement, mais je doute que IE peut faire mieux. Comme vous pouvez le voir j'ai fait un consistant seulement les animations (aucune détection de coup, logique de jeu ou gestionnaire mousemove) et la vitesse est toujours inacceptable.

Pour Firefox Je pense que j'ai découvert how pour éviter morosité:

var mouseMove = function(e) { 

    // only do this if there's at least 20ms diff. 
    var now = +new Date(); 
    if (now - mouseMove.last < 20) 
     return; 
    else 
     mouseMove.last = now; 

    // ... 
}; 

mouseMove.last = +new Date(); 
1

Réduire au minimum le nombre d'appels DOM.