• Boucles sur tableau - nouvelles commandes


    Bonjour tout le monde ,

    J’ai remarqué que pas mal de développeurs n’utilisent pas les ‘nouvelles’ commandes pour les boucles proposées par BIS , qui permettent de rendre votre code plus court , clair et performant.
    Ceci n’est pas un guide sur les performances malgré que toutes les nouvelles syntaxes proposées ci-dessous soit plus performantes et concises.
    Ce post a été créé dans le but de vous mettre au courant de ces nouvelles commandes.

    Recherche d’un élément dans un tableau : findIf (depuis v1.82)

    Exemple : Créons une méthode qui retourne le premier objet en vie dans un tableau d’objet et qui retourne ObjNull si aucun objet n’a été trouvé.

    Ancienne méthode :

          params ["_tableau"]; //équivalent à : private _tableau = _this select 0;
    
          private _return = objNull;
          {
                 // si l'objet est en vie , on quitte la boucle => gain de performances
                 if (alive _x) exitWith {
                      _return = _x;
                 };
          }foreach _tableau;
    
          _return; // on retourne _return (logique)
    

    Nouvelle méthode :

         params ["_tableau"];
         _found_index = _tableau findIf {alive _x};
         if (_found_index != -1) then {
           // un fou m'aurait dit de faire (_tableau # _found_index)
           _tableau select  _found_index
         }else{
            ObjNull
         };
    

    La différence au niveau de la longueur du code n’est pas flagrante mais une simplification est possible pour les maniaques.

    Recherche de plusieurs éléments dans un tableau : select (Alternative Syntax 5) (depuis v1.55)

    Exemple : Créons une méthode qui retourne tous les objets en vie dans un tableau.

    Ancienne méthode :

          params ["_tableau"];
    
          private _return = [];
          {
                 // si l'objet est en vie , on l'ajoute au tableau
                 if (alive _x) then {
                       // commande pushback vivement conseillée 
                       _return pushBack _x;
                 };
          }foreach _tableau;
    
          _return;
    

    Nouvelle méthode :

         params ["_tableau"];
         // on retourne le résultat de la commande directement , d'ailleurs la création d'une telle fonction est rendue inutile
         _tableau select {alive _x};
    

    Ici la différence en performances et en prise de place est flagrante et est assez explicite.

    Application d’un code pour chaque éléments d’un tableau : apply (depuis v1.56)

    Exemple : Créons une méthode qui retourne les uid de tous les joueurs connectés.

    Ancienne méthode :

          private _return = [];
          {
                   _return pushBack  (getPlayerUID _x);
          }foreach allPlayers; 
          //allPlayers est un tableau contenant tous les joueurs connectés
          _return;
    

    Nouvelle méthode :

         allPlayers apply {getPlayerUID _x};
    

    Comptage du nombre d’éléments remplissant une condition spécifique : count (depuis toujours)

    Cette commande n’est pas vraiment nouvelle mais je préfère quand même la mentionner.

    Exemple : retourne le nombre de joueurs en vie.

    “Ancienne” méthode :

          private _count = 0;
          {
                 _count = _count + 1;
          }foreach allPlayers;
          _count;
    

    “Nouvelle” méthode :

         {alive _x} count allPlayers;
    

    Cette commande est jugée par certains développeurs légèrement plus rapide qu’un foreach classique car elle ne possède pas de _foreachIndex mais je déconseille vivement de l’utiliser pour remplacer vos foreach car cela rendrait votre code peu esthétique pour un gain de performances minime.

    N’hésitez pas à me corriger car tout ça est fait de tête et des explications plus poussées peuvent être également nécessaires. Un comparatif des performances en ‘ms’ pourrait même être réalisé afin de mesurer la différence entre nouvelle et ancienne méthode.

    AmauryD

  • salut sympas comme idée a mettre dans le wiki

  • hello … une bonne idee mais attention on touche au code Arma et chaque fonction ou code est a prendre au cas par cas.

    Selon ce que tu fais , une commande moins optimise peut etre plus optimise dans ton code. Perso je me refere toujours a la documentation du wiki et tu verra qu il y a des choses surprenantes :
    https://community.bistudio.com/wiki/Code_Optimisation

  • Merci pour ces exemples de nouvelles commande !!! Le code deviens plus sexy :)

    Idem pour la réflexion que Brutal . Ces commandes sont syntaxiquement plus simple ! Sauf qu’il faut vérifier sont optimisation !

    Et nous savons tous que nous courons à sont optimisation … Surtout pour si on utilise une synchronisation joueur ^^.

Messages 4Vues 348