Bonjour à tous !

Je développe un jeux en 2D avec pas mal d’interaction multiples. Parmi elle, le spawn des créatures. Je génère la map avec un perlin noise, il se peut donc que des zones soient close.

J'ai donc écris un code qui crée une liste contenant seulement les cases marchable. Il prends une case au hasard et fait un étalement sur les quatre cases adjacentes (haut, droite, bas et gauche) tant qu'elles sont présente dans la liste (donc marchable)
De cette façon j'obtiens des listes de cases de zone entière avec un % me permettant d'estimer si cette liste de case doit figurer ou non à la liste du spawn.

Donc le code marche, mon soucis qui me fais venir poster sur ce forum est le suivant ; Ce code est quasiment 20 fois plus lent à exécuter que la génération de la map, pourriez-vous m'aider à l'optimiser/trouver une solution plus efficace ?

Voici le code ;

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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 
	/** on définis quel est la grande zone de la map **/
	private void makeSpawnPossible() {
		Map<Pos, Cell> possible = new HashMap<>();
 
		/** on liste les cases marchable **/
		for(Chunk cc : chunks.values())
			for(Cell c : cc.cells.values())
				if(c != null && !c.unwalkable)
					possible.put(c.realPos(), c);
 
		int size = possible.size();
 
		Map<Integer, List<Cell>> zones = new HashMap<>();
 
		spawnPossible.cleanup();
 
		/** tant qu'il reste des cases à caser **/
		while(possible.size() > 0) {
 
			/** on choisis d'abord une case au hasard **/
			List<Cell> ll = new LinkedList<>(possible.values());
			Collections.shuffle(ll);
 
			Cell start = ll.get(0);
			possible.remove(start.realPos());
 
			/** étalement **/
			/** pouf info, SynchMap c'est juste une HashMap que j'ai synchronisé **/
			SynchMap<Pos, Cell> select = new SynchMap<>();
 
			select.put(start.realPos(), start);
 
			while(true) {
				boolean hasResult = false;
 
				for(Cell cell : select.values())
					for(Cell c : cell.getNears())
						if(c != null && possible.containsKey(c.realPos())) {
							possible.remove(c.realPos());
							select.put(c.realPos(), c);
							hasResult = true;
						}
 
				if(!hasResult) break;
			}
 
			double f1 = select.size();
			double f2 = size;
			double f = (f1 * 100) / f2;
 
			/** si contient plus de 30% de la map ont garde **/
			if(f > 30) {
				for(Cell c : select.values())
					spawnPossible.put(c.realPos(), c);
			}
 
			zones.put(zones.size()+1, new ArrayList<>(select.values()));
		}
	}
Dans le pire des cas je fais tourner l'algorithme passivement mais en partant du joueur..

En vous remerciant