Bonjour, pour un projet, je dois réaliser une appli en java analysant une vidéo de visage en temps réel de façon a suivre les contours des yeux et de levres à l'aide de contours actifs.
J'utilise pour çà le JMF qui me permet de recupérer et d'analyser les frames d'une vidéo très facilement. Malheurement, le JMF est dejà assez gourmand en ressource et j'ai encore plein de calcul a faire derrière !
En gros, les contours actifs sont basé sur un algo itératif de minimisation de leur énergie et sont ainsi capable de suivre les pixels à gradients elevé d'une frame à l'autre. Mon problème est que j'ai besoin d'un code parfaitement optimisé car chaque milliseconde de calcul compte ici (j'ai environ une cinquantaine de milliseconde de dispo maximum par frame). En gros si mon appli utilise plus que le temps dont elle dispose pour traiter une frame, la frame suivante sera tout simplement ignoré, ce qui a pour effet de sauter des frames et donc d'empécher un suivi de contour efficace.
C'est pourquoi j'ai besoin de votre aide pour optimiser mon code et essayer de gangner des millisecondes. J'ai quelques questions :
_ travailler en float ou en double ? j'imagine qu'en float c'est plus rapide puisque c'est coder sur moins d'octets. Maintenant pour graphics2D ou on a le choix ca ne pose pas de problème mais les méthodes de java.lang.Math retourne en général des double. Est ce qu'une conversion de type de style (double) ou (float) et efficace niveau perf ? Et comment eviter la conversion implicite en double ?
_ J'ai une méthode d'une classe qui est appelé dès que le prog recupère le buffer d'une frame. Vaut il mieux instancier ses objets dans la fonction (donc a chaque appel) ou plutot en global dans la classe pour ne le faire qu'une seule fois et ensuite travailler sur leur contenu ?
_ L'appel de fonctions ralenti t'elle le code ? Par exemple dans une boucle, vaut il mieux appeler une fonction ou non ? Quitte a perdre en clarté mais gagner en perf.
_ Enfin le garbage collector est il vraiment optimisé ? Est ce que c'est utile de détruire ses références avec null ou au final ca ne sert pas a grand chose ? Et quand est il de l'appel a finalize() ?
_ Vaut il mieux créer des variable de type ou bien utiliser directement des methodes ? Par exemple j'ai la fonction getNb() qui me renvoit un nombre entier (ensupposant bien sur que je ne peux pas réunir les 2 boucles en une) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 int i,a=getNb(); for(i=0;i<a;i++) {} for(i=0;i<a;i++) {}Lequel est le plus performant ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 int i; for(i=0;i<getNb();i++{} for(i=0;i<getNb();i++{}
Voila, désolé pour ce post un peu long mais je suis un peu novice en utilisation mémoire comme java gère tout pour nous et je n'ai pas une très bonne connaissance de la façon dont un compilateur fonctionne. J'espère vous pourrez m'apporter quelques éléments de réponses. Merci
Partager