Go Down

Topic: Free Memory : pas le même résultat (Read 3 times) previous topic - next topic

jihelbi

De toute façon pour l'ingé soft obsédé d'optimisation maximaliste il n'y a que le C++ avec du C et de l'assembleur inside... Mais je croyais cette population en voie d'extinction... Le sable est moins cher que les neurones... Il y a même des pervers qui pourfendent l'utilisation de l'enclume à écraser les mouches... Alors qu'il est quand même moins cher d'utiliser un DSP plutôt que de mettre au point le montage à trois transingues qui fait la même chose...

JLB

patg_



Le garbage collector Java récupère la mémoire des objets non référencés puis défragmente ensuite l'espace mémoire.
Il y a d'ailleurs plusieurs algorithmes disponibles.

L'activation du garbage collector en java (et dérivé, android, etc) est le truc chiant par excellence quand on code un jeu ou une application graphique ...
La 1er chose à faire est de le désactiver, et de lancer le garbage collector à la main pendant un temps "libre", sinon -> lags.
(En gros vive System.gc(); \o/)


Le choix du bon algorithme de GC et de ses divers paramètre est aussi une option envisageable...et moins radicale!
Mais bon, les développeurs Java qui savent tuner une JVM ça ne court pas les rues  :smiley-mr-green:
Cependant je ne connais pas vraiment le développement de jeu en Java. Je suis plus dans l'info de (di)gestion. Et je m'amuse avec le dév sur AVR pour le plaisir.

OLIVIERC67


Je n'ai même pas résumé, car il y a autant de choses à décrire qu'il y a de transistors dans le µP (en gros...)

Pour les histoires d'allocation des variables locales, je viens d'apprendre un truc, merci les gars!

Selon le nombre de fonctions de mon programme, j'utilise au max les interruptions. Par exemple, j'ai trouvé un moyen d'utiliser un clavier matriciel sans aucun appel de fonction : je branche les colonnes sur un port (prenons le port X par exemple) et les lignes sur le port Y. le port Y contient l'interruption PCINT1 (Pin Change INTerrupt). cette interruption est déclenchée dès qu'une des pin du port change, ce qui est très pratique dans mon cas, la lecture du clavier dans mon programme se résume alors à la lecture de la variable key :

Code: [Select]

#define NO_KEY 0xFF;  // code "pas de touche"
volatile byte lignes, colonnes, key;

void KeybInit(){       // initialisation du clavier
  PORTX en sortie;  // Préparation des colonnes
  PORTX = 0x00;

  PORTY en entrée;  // Préparation des lignes
  PORTY = 0xFF;  // pullup sur les lignes

  Autoriser PCINT1 sur PORTY;  // démarrer la lecture sur interruption
}

ISR(PCINT1-Vect)(){        // routine d'interruption appelée dès qu'une pin du port Y change d'état (appui sur une touche ou relâchement)
  Désactiver PCINT1 sur PORTY;
  colonnes = PINY;     // lecture de la ligne qui a changé d'état

  PORTX en entrée;  // Préparation des colonnes
  PORTX = 0xFF;  // pullup sur les colonnes

  PORTY en sortie;  // Préparation des lignes
  PORTY = 0x00;

  lignes = PINY;  // lecture de la ligne de la touche enfoncée
  key = decodeKey(lignes, colonnes);  // décodage du code de la touche
  keybInit();  // réinitialisation du clavier
}

void setup(){
  key = NO_KEY;
  keybInit();
}

void loop(){
if (key != NO_KEY){
  switch (key){  // ne fait appel à aucune fonction (donc très rapide)
    case 0x00 :
      //traitement touche code 0x00
      break;
    case 0x01 :
      //traitement touche code 0x01
      while (key == 0x01);  // attente du relâchement de la touche
      // faire quelque chose
      while (key == NO_KEY);  // attente de l'appui sur une nouvelle touche
      // faire encore quelque chose
      while (key != NO_KEY);  // attente du relâchement de toutes les touches
      break;
  }
}
}


Ici, j'ai grandement simplifié, la fonction decodeKey n'est pas là, elle transforme le couple (lignes, colonnes) en un code sur un octet (utile pour un clavier à touches numérotées... la touche "1" donne la valeur 1 etc etc.

J'avoue qu'un arduino Mega sera bien plus adapté à ce genre de code car il possède beaucoup de PCINT, permettant de gérer ainsi des claviers de 256 touches voire plus, sans avoir besoin de balayer les lignes et colonnes en continu, le gain de temps est bien plus que considérable, car si on n'appuie sur aucune touche, alors on peut résumer la loop ainsi :

Code: [Select]

void loop(){
if (key != NO_KEY){
    // peu importe ce qu'il se passe ici, car on n'appuie sur aucune touche : key = NO_KEY...
}
}


et donc loop boucle uniquement sur un simple if. Ce n'est qu'un exemple, mais de cette même manière, on peut gérer le clavier quand et comme on veut!

Dans mes programmes utilisant ce genre de manip d'int pour un clavier, la loop contient un menu (dans lequel on navigue via le clavier).

si ça peut donner des idées, prenez, prenez! faudrait que j'en fasse une lib (je sais toujours pas comment on fait, j'ai essayé une fois sans résultat), ça serait grandement pratique pour beaucoup, car la lib Keypad est vraiment très lente (du digitalWrite et Read à foison avec je ne sais combien de if()...) et bug de temps en temps...


Et sur un mega, on peut pas faire de int sur l'ensemble des pin je suppose ? Il me semble avoir lu que c'etait limité à 6 pins chez arduino.

L'idée serait de prioriser l'ensemble des DI (digitals input) alors que le traitement "secondaire" type affichage LCD, écriture carte SD seraient moins prioritaire.
Évidement, les DI ne serait pas sollicitées à une cadence folle. Ça dans le cadre de la domotique.


- 1 mega 2560
- 1 Raspeberry Pi (en pré-commande)
- Quarante douze PC
- beaucoup de volonté, pas beaucoup de temps.
- Ma religion : OpenSour

osaka

#23
Jun 07, 2012, 06:28 pm Last Edit: Jun 07, 2012, 08:20 pm by osaka Reason: 1

Et sur un mega, on peut pas faire de int sur l'ensemble des pin je suppose ? Il me semble avoir lu que c'etait limité à 6 pins chez arduino.


il me semble qu'il y ait 1 PIN/INT par registre, mais qu'il est également possible d'avoir une interruption non sur une pin en particulier mais sur 1 registre et à ce moment là c'est à toi de vérifié laquel de ses pin correspondant au registre à été modifier.
Il me semble avoir vu quelque chose comme ça, avis aux expert ?

Edit: Je me disais bien avoir aperçu quelque chose dans le style récemment, voir le tuto de 68tjs http://arduino.cc/forum/index.php/topic,100906.0.html

PS: Pour java il est effectivement rare de rencontrer des personnes sachant tuner sa MV  :smiley-sweat:, souvent en entreprise il y a une personne dédié qui ce charge de calà, ainsi que du déploiement, etc.
Maintenant il est clair que java et ça MV il ne faut pas compter dessus pour faire un "call of duty", chaque langage sera choisi selon la situation et ça priorité (ressources, dépendances, etc) .

OLIVIERC67



Et sur un mega, on peut pas faire de int sur l'ensemble des pin je suppose ? Il me semble avoir lu que c'etait limité à 6 pins chez arduino.


il me semble qu'il y ait 1 PIN/INT par registre, mais qu'il est également possible d'avoir une interruption non sur une pin en particulier mais sur 1 registre et à ce moment là c'est à toi de vérifié laquel de ses pin correspondant au registre à été modifier.
Il me semble avoir vu quelque chose comme ça, avis aux expert ?

Edit: Je me disais bien avoir aperçu quelque chose dans le style récemment, voir le tuto de 68tjs http://arduino.cc/forum/index.php/topic,100906.0.html
...


Super merci.
Son tuto est très clair.

- 1 mega 2560
- 1 Raspeberry Pi (en pré-commande)
- Quarante douze PC
- beaucoup de volonté, pas beaucoup de temps.
- Ma religion : OpenSour

Go Up