IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Multithread - optimisation à cause de ralentissements


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 391
    Par défaut Multithread - optimisation à cause de ralentissements
    Bonjour à tous =D,



    j'essaie de faire un "Zelda-like" en Java avec libgdx, et comme je pourrais avoir beaucoup d'ennemis sur ma carte, j'ai opté pour l'utilisation de Threads.

    Cependant, quand il commence à y avoir plus d'une quinzaine de Threads, mon programme commence à montrer des signes de ralentissements.

    Voici un peu la logique de ce que j'ai fais :



    - Une classe "Ennemi" hérite de Thread

    - Un ennemi bouge de manière aléatoire et à chaque pas, il vérifie s'il ne rencontre pas un obstacle...

    - ... pour cela, il accède à une Collection de Rectangle (qui représentent les obstacles) pour vérifier s'il ne va pas entrer en collision.

    - ... cette Collection est partagée entre tous les ennemis (et le joueur aussi); elle fait partie d'un Singleton.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    synchronized (InfosSingleton.getInstance().getCollisionObjects()) {
    			for (MapObject obj : InfosSingleton.getInstance().getCollisionObjects()) {
    				String typeTerrain = (String) obj.getProperties().get("type");
    				RectangleMapObject rectMapObject = (RectangleMapObject) obj;
    				Rectangle rectObject = rectMapObject.getRectangle();
     
    				if(Intersector.overlaps(rectObject, rectangleColl)){
    					if(obj.getProperties().get("type") != null){
    						if("Brulable".equals(typeTerrain) && !enTrainDeBruler){
    							situationEnnemi = SituationEnnemi.BRULER;
    						} else if("Tombable".equals(typeTerrain)){
    							situationEnnemi = SituationEnnemi.TOMBER;
    						} else if("Sautable".equals(typeTerrain)){
    							situationEnnemi = SituationEnnemi.BLOQUER;
    						}
    					}
    					else{
    						situationEnnemi = SituationEnnemi.BLOQUER;						
    					}
    				}
    			}
    		}
    Je pense que ça ralentit à cause de cet accès concurrentiel à la Collection mais j'aimerais bien avoir votre avis parce que je ne suis pas expert en Thread.

    Peut-être que je me trompe et que vous aurez une autre idée =D.


    Merci d'avance

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ça ne va pas marcher avec ce genre de design. Tout ce que fait le thread c'est dire au autres "bougez plus, je calcule". Du coup, ben c'est comme si tu n'avais pas de threads, sauf que du coup tu ne peux plus garantir que tes ennemis aurant tous du temps de calcul.

    Je ferais un thread unique qui gère en séquence chaque ennemi devant bouger depuis la dernière séquence. Pour optimiser, quand tu aura beaucoup d'ennemi, tu peux commencer à diviser ton espace et consacrer des thread à chaque zone, avec chaque zone sa liste d'obstacles.

    Une alternative, c'est de considérer que la collection d'obstacles ne change pas. Tu n'auras alors pas besoin de synchroniser. Mais tes thread devront travailler sur une sorte de séquence collaborative:
    d'abord tout le monde fait éventuellement un choix de mouvement. Ensuite quand tout le monde a choisi, le moteur gère les conflits "ha perdu X est passé devant toi tour perdu" et met à jour les obstacle, ensuite chacun fait ses calculs de dégats indépendament.


    A noter qu'il vaut mieux éviter de faire trop de thread. Un pc, aujourd'hui, c'est de l'ordre de 8 à 16 coeurs, c'est donc inutile en général de mettre plus de 16 threads. Sans compter que le context switching, ça prend aussi du temps

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 391
    Par défaut
    Salut. Merci pour ta réponse.
    Je pense avoir saisi ce que tu me dis.
    En gros, si j'ai une grosse map avec plein d'ennemi. Je peux, par exemple, instancier 4 threads qui géreront chacun leur ennemi selon 4 parties de la carte, et je met en pause les threads dont mon personnage n'est pas présent dans leur partie ?

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    je pensais plutot à diviser par exemple en 4, comme ça chaque thread à sa propre liste d'obstacle et peux travailler sans avoir besoin de locker quoi que ce soit Pas pour les mettre en pause, mais c'est sur que pas besoin de faire bouger des ennemis qui sont de toutes façons pas visible

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 391
    Par défaut
    Ok parfait. Ben je vais essayer de voir comment faire ça et je mettrais en résolu si j'y arrive lol. Merci =D

Discussions similaires

  1. [Flash Pascal] Cause du ralentissement progressif d'une animation
    Par Roland Chastain dans le forum Flash Pascal
    Réponses: 2
    Dernier message: 27/10/2014, 18h36
  2. Optimisation requête pour cause de Maximum execution time
    Par cans38 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/09/2008, 15h36
  3. ralentissement windows causé par la carte graphique
    Par dark vador dans le forum Composants
    Réponses: 9
    Dernier message: 07/11/2007, 09h13
  4. Réponses: 10
    Dernier message: 08/12/2006, 00h01
  5. [Collection] Optimisation d'un traitement multithreads
    Par in dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 30/11/2006, 10h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo