Minecraft et les Threads, le retour !



  • Bonjour,

    C'est encore moi et je suis encore embêté par les threads.
    Enfin pas vraiment, il y a juste un fonctionnement que je ne comprends pas trop.

    À la réception d'un paquet côté client, je voudrais récupérer le nom du joueur correspondant au client. Pour ça je suis tenté de faire ceci :

    Minecraft.getMinecraft().player.getName();
    

    Sauf que sur le thread Netty Client IO l'objet player est null. Du coup je passe par le Client thread :

    Minecraft.getMinecraft().addScheduledTask (new Runnable(){
    
         @Override
         public void run (){
              Minecraft.getMinecraft().player.getName();
         }
    });
    

    Et ça fonctionne très bien !
    Ce que je ne comprends pas c'est pourquoi player est null sur le thread Netty Client IO mais qu'il est instancié sur le Client thread alors que player appartient à l'objet theMinecraft qui lui est static donc commun au deux threads.

    Merci.


  • Administrateurs

    Salut,
    Car dans certains cas un paquet peut arriver avant que l'objet player soit initialisé.
    Alors que si tu passes par addScheduledTask, le code est exécuté plus tard par minecraft, à un moment où il est certains qu'il soit initialisé.



  • Oui effectivement ! J'y ai pensé juste après avoir posté mon message, mais j'étais pas sûr.
    Merci encore et désolé du post inutile.

    EDIT : Du coup j'utilise plutôt cette technique, je trouve ça plus propre :

    while (Minecraft.getMinecraft().player == null){
         System.out.println ("Waiting for Minecraft.getMinecraft().player initialization…");
         try{Thread.sleep (100);}catch(InterruptedException e){e.printStackTrace();}
    }
    
    Minecraft.getMinecraft().player.getName();
    

  • Administrateurs

    Heu non, pas du tout, tu viens de passer d'un code propre à un hack très très sale.

    Ça me fait penser à ce commit strip : http://www.commitstrip.com/fr/2017/05/22/a-story-about-callbacks/?

    Pourquoi c'est très très sale ?
    1. Si player est initialisé juste après le check, tu retardes l'exécution du code dans le pire des cas de 99 ms.
    2. Tu ajoutes des cycles cpu inutile pour vérifier une condition qui n'aurai pas besoin d'être vérifiée.
    3. Et tu bloques le thread de netty inutilement, ce qui retardera le traitement d'autres paquets.



  • Ha oui effectivement ! C'est vrai que si tout le monde fesait comme moi le démarrage de Minecraft durerait 1 an XD
    Mdr sur l'image que t'as partager tout y est ! 😄 Je me sens un peut bête maintenant -_-.

    Du coup je reviens comme avant.