[j2me] Vitesse des boucles pour un dessin

Twub Messages postés 16 Date d'inscription lundi 31 mars 2008 Statut Membre Dernière intervention 21 avril 2009 - 9 mai 2008 à 12:08
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 9 mai 2008 à 16:17
Bonjour,

Voila je m'expose a un probleme bizarre, j'ai crée ma propre fonction de dessin d'un rectangle dans mon image, seulement elle est extrement lente.
Pour vous expliquer, voici ma fonction:

public void fillRect2(int _x, int _y, int _w, int _h, int _ARGB)
{
    int yDebut = _x+_y*this.__width;
    int yFin = _x+(_y+_h)*this.__width;
    int w = _w;
    int j, i;
    int width = this.__width;
    
    for(j = yDebut; j<=yFin; j += width)
    {
        for(i = j; i < w; i++)
            this.__tabJeux[i] = _ARGB;
    
    
        w += width;
    }
}

Ici le __tabJeux est le tableau de pixel de mon image.

Comme vous voyez c'est exrement simple, seulement comparé au fillRect de la librairie Graphicscde JAVA, c'est lent.

En effet le fillRect de java exécuté 100fois met 3ms et le mien exécuté aussi 100fois met 600ms environ...

Je pense que cela vient du fais de ma boucle, mais je n'en suis pas sur du tout, auriez vous une explication ou une solution svp ^^

Voila, merci de votre aide ;)

Twub

8 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
9 mai 2008 à 14:01
Salut,

Soit à chaque fois que tu modifie ton tableau de pixels, l'affichage est mis à jour, ce qui rend ton algorithme bien plus lent, soit les fonctions de l'API Java sont natives, et donc bien plus rapide à exécuter que du code java managé (je pencherai plutôt pour la seconde !).
______________________________________
DarK Sidious
0
Twub Messages postés 16 Date d'inscription lundi 31 mars 2008 Statut Membre Dernière intervention 21 avril 2009
9 mai 2008 à 14:07
Oui étant donné que je gere l'affichage qu'une fois le tableau rempli, la premiere hypothese me parait donc impossible.
Seulement il n'existerait pas en java la façon d'augmenter la rapidité de mon code? gérer la priorité par exemple?

Merci de ta reponse.

Twub
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
9 mai 2008 à 15:05
Salut,

600 ms pour 100 affichages, ca me paraît quand même pas trop mal pour du code managé ! Ca fait moins de 6 ms par tracé...

A titre de comparaison, le VB est beaucoup plus lent sur un PC : environ 16 ms par tracé en utilisant l'API Windows.

Je présume que tu veux utiliser ce code pour ton algorithme de déformation d'image...

Je t'avais conseillé d'utiliser les fonctions standard de l'API, et il semblerait bien que J2ME gère les Graphics2D vu qu'ils sont intégrés dans la doc de sun pour J2ME (il s'agit d'un package optionnel, mais package disponible tout de même) :
http://java.sun.com/javame/reference/apis/jsr209/

Tu te prendrais bien moins la tête en utilisant l'API standard.
______________________________________
DarK Sidious
0
Twub Messages postés 16 Date d'inscription lundi 31 mars 2008 Statut Membre Dernière intervention 21 avril 2009
9 mai 2008 à 15:27
Bonjour,

Non l'algo de déformation de l'image je l'ai réglé, il est optimisé

Celui-ci, me permet juste de faire un pot de peinture dans une zone rectangulaire. Je ne peux par ailleurs pas utiliser les fonctions standard de dessin de java, puisque mon ecran est un tableau de pixel que je rempli case par case.
La pour laquel je refais les fonctions de dessin, c'est qu'elles sont toutes plus rapide que celle de java.
Toutes plus rapide sauf celle-ci...

Je n'ai pas vraiment d'explication de pourquoi celle-ci est plus lente...?

Mais en tout cas merci de t'y préocuper

Twub
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
9 mai 2008 à 15:42
Salut,

Et bien déjà, une toute petite optimisation :

for(i = xDebut; i<=xFin; i += height)
    {
        for(j = i; j < w; j++)
            this.__tabJeux[j] = _ARGB;
   
   
        w += width;
    }

Explication : Il y a de grandes chances que les pixels de ton tableaux soit rangés en mémoire sur les coordonnées X en ligne, et Y en colonnes, c'est à dire : [i, j][i + 1, j][i + 2, j]...[i + width, j][i, j + 1]...

Il est ainsi plus rapide pour le processeur de lire séquentiellement les tableaux de i qui ont de grande chance d'être placés en cache plutôt que de lire d'abord les j puis les i.

Mais ca ne te fera pas gagner 500 ms !

Montre nous plutôt comment tu appelle ta fonction, on ne sais jamais...
______________________________________
DarK Sidious
0
Twub Messages postés 16 Date d'inscription lundi 31 mars 2008 Statut Membre Dernière intervention 21 avril 2009
9 mai 2008 à 16:01
Re-Bonjour,

en fait si tu regarde bien , c'est ce que mes boucles font deja, je calcul a quel pixel sur y je dois commencer et auquel je dois m'arreter.
Et donc je rajoute width pour aller a la ligne du dessous et je la rempli jusqu'a arriver au bout puis rebelotte, je vais a la ligne du dessous

Pour mon appel de fonction pour mes tests je le fais dans un programme a part pour etre sur de mes résultats de vitesse.

Voila,

Twub
0
Twub Messages postés 16 Date d'inscription lundi 31 mars 2008 Statut Membre Dernière intervention 21 avril 2009
9 mai 2008 à 16:04
Ps: je comprend ta confusion, dans mon code j'ai nommé mon i avec j et mon j avec i ^^

Dsl ^^

Twub
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
9 mai 2008 à 16:17
Salut,

Arf, t'as raison, ca m'a induit en erreur :p
______________________________________
DarK Sidious
0
Rejoignez-nous