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