• S'inscrire
    • Se connecter
    • Recherche
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes

    Résolu Minecraft et les Threads, le retour !

    1.11.x
    2
    5
    1002
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • Cl00e9ment
      Cl00e9ment dernière édition par

      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.

      1 réponse Dernière réponse Répondre Citer 0
      • robin4002
        robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

        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é.

        1 réponse Dernière réponse Répondre Citer 0
        • Cl00e9ment
          Cl00e9ment dernière édition par

          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();
          
          1 réponse Dernière réponse Répondre Citer 0
          • robin4002
            robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

            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.

            1 réponse Dernière réponse Répondre Citer 0
            • Cl00e9ment
              Cl00e9ment dernière édition par

              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.

              1 réponse Dernière réponse Répondre Citer 0
              • 1 / 1
              • Premier message
                Dernier message
              Design by Woryk
              Contact / Mentions Légales

              MINECRAFT FORGE FRANCE © 2018

              Powered by NodeBB