Flash : HitTest vs GetPixel
Je travaille actuellement sur un jeu qui nécessite de nombreux tests de collision. Bien que le test ait probablement déjà été réalisé, j’ai souhaité comparer les performances de deux méthodes : hitTestPoint de la class DisplayObject et le getPixel de la classe BitmapData. Les résultats montrent une différence du simple au triple en faveur du getPixel.
Ces deux méthodes peuvent être comparées lorsque vous pouvez générer une BitmapData aux couleurs simplifiées, le mieux étant bicolore, afin de tester la couleur en un point donné.
L’inconvénient des hitTest est qu’ils ne s’appliquent qu’à un seul objet DisplayObject à la fois pour être précis. Si vous avez de nombreux objets à tester, cette méthode risque de beaucoup ralentir votre application.
Principe du test
Voici le test que je vous propose : je souhaite savoir si un sprite nommé bille entre en collision avec un sprite nommé mur. Mais je veux également savoir si la collision se fait sur l’axe des x, sur l’axe des y ou les deux, chacun ayant un traitement distinct.
Il me faut donc deux tests :
- Détection de la collision en x sur les deux côtés
- Détection de la collision en y haut et bas
Spécificités des bitmaps
Pour le test du hitTest, aucune modification spéciale n’est à ajouter, il vous faut les deux clips à tester sur la scène.
Pour le getPixel, vous devez tout d’abord construire (ou charger) votre bitmap :
var _oBmpData: BitmapData ; var _oBmp : Bitmap ; _oBmpData = new BitmapData(mur.width, mur.height, false, 0x000000); _oBmp = new Bitmap(_oBmpData); addChild(_oBmp) ; _oBmpData.draw(mur); // ici nous donnons le motif du Sprite pour composer le bitmap
Les tests
Les tests proprement dits :
- Avec le hitTestPoint :
if (mur.hitTestPoint(zone.right , bille.y ) != false || mur.hitTestPoint(zone.left, bille.y ) != false) test = true ; if (mur.hitTestPoint(bille.x, zone.top ) != false || mur.hitTestPoint(bille.x, zone.bottom ) != false) test = true ;
- Avec le getPixel :
if (_oBmpData.getPixel(zone.right , bille.y ) != 0 || _oBmpData.getPixel(zone.left, bille.y ) != 0) test = true ; if (_oBmpData.getPixel(bille.x, zone.top ) != 0 || _oBmpData.getPixel(bille.x, zone.bottom ) != 0) test = true ;
Résultats
Voici le test ci-dessous, vous constaterez que la difference de performance est du simple au triple en faveur du getPixel.



Salut,
Sympathique petit article.
Une remarque pour ton test : il faudrait que tu précises ce qui est calculé. A priori, tu fais un certain nombre de boucles. Mais le nombre qui est affiché correspond à quoi ? Si ce sont des temps, dans ce cas, plus c’est petit, mieux c’est. Par contre, si c’est des compteurs dans les boucles, plus c’est grand, mieux c’est ça.
Par exemple, j’obtiens :
HITTESTPOINS : 2365
GETPIXEL : 349
Comme je ne sais pas s’il vaut mieux avoir plus ou moins, je ne peux pas dire lequel est le meilleur.
En général, dans les benchmarks, on précise toujours « lower is better » ou « higher is better ».
Voili voilou.
Bises.
Bonjour,
Effectivement je n’ai peut être pas été assez claire. Généralement, lorsqu’un test a lieu sur un nombre de boucles donné, la comparaison se fait sur le temps d’exécution.
Le test indique donc, pour le nombre de boucles que tu auras saisi, le temps pris pour réaliser ces boucles pour le hitTest et pour le getPixel. Et globalement, plus le temps d’exécution est faible, plus le code est optimisé !
Désolée pour ce manque de précision, et en espérant avoir répondu à ta question.