Speicher geht mir bei einfachen Methodenaufrufen aus.

Kai008

Erfahrenes Mitglied
Ich habe eine leere HashMap, in die ich Inseln generieren will. Derzeit nur 2 Objekte: Weed für Wiese und Water für Wasser.
Die Methode schaut zwar ziemlich kompliziert aus, ist aber im grunde ganz einfach. Trotzdem habe ich sie durchkommentiert, damit ihr euch auskennt:

Java:
private HashMap<String, Terrain> startGenTerrain()
{
	HashMap<String, Terrain> terrainMap =
		new HashMap<String, Terrain>();
	
	int x = (int)Math.floor(Math.random() * 50) * 40; //Zufaellige Position der Insel
	int y = (int)Math.floor(Math.random() * 50) * 40; //Zufaellige Position der Insel
	
	terrainMap.put(x + ";" + y, new Weed(x, y)); //Erste Wiese einfuegen
	
	terrainMap = this.genTerrain(x + 40, y, terrainMap); //Insel in jede Richtung erweitern
	terrainMap = this.genTerrain(x - 40, y, terrainMap); //Insel in jede Richtung erweitern
	terrainMap = this.genTerrain(x, y + 40, terrainMap); //Insel in jede Richtung erweitern 
	terrainMap = this.genTerrain(x, y - 40, terrainMap); //Insel in jede Richtung erweitern
	
	return(terrainMap);
}
private HashMap<String, Terrain> genTerrain(int x, int y, HashMap<String, Terrain> terrainMap)
{
	int rand = (int)Math.floor(Math.random() * 10); //Zahl um Generierung in die Richtung zu beenden
	
	if(rand <= 9) //Beenden
		return(terrainMap);
	
	terrainMap.put(x + ";" + y, new Weed(x, y)); //Wiese einfuegen
	
	terrainMap = this.genTerrain(x + 40, y, terrainMap); //Insel erweitern
	terrainMap = this.genTerrain(x - 40, y, terrainMap); //Insel erweitern
	terrainMap = this.genTerrain(x, y + 40, terrainMap); //Insel erweitern
	terrainMap = this.genTerrain(x, y - 40, terrainMap); //Insel erweitern
	
	return(terrainMap);
}
private HashMap<String, Terrain> fillMapWithWater(HashMap<String, Terrain> terrainMap)
{
	//Jede Tilde, die nicht zu einer Insel gehoert, mit Wasser fuellen.
	for(int i = 0; i < 50; i++)
		for(int j = 0; j < 50; j++)
			if(terrainMap.get(j * 40 + ";" + i * 40) == null)
				terrainMap.put(j * 40 + ";" + i * 40, new Water(j * 40, i * 40));
	return(terrainMap);
}

Das Problem ist, wenn ich in Zeile 3 der Methode genTerrain(HashMap) die Zahl, die das Generieren in diese Richtung abbricht (soll ja zufällig sein) runtersetze, bekomme ich eine Heap-Space-Exception. Nur ich kann nicht glauben, dass diese Methoden annähernd so viel Speicher verbrauchen, wie die VM von Java reserviert. (Glaube 128 MB, ist aber auch egal.) Also muss der Fehler wo anderst sein, aber finde einfach nix. Kann mir bitte wer sagen, wo er ist?
 
Du rufst in genTerrain die Methode genTerrain noch einmal auf. Da du das ganze zufällig steuerst kannst es zufällig auch seeeehr lange dauern bis die Methoden sich beenden. Und somit bekommst du einen zu langen StackTrace und der Speicher geht dir aus. Du solltest deinen Algorithmus also nochmal überdenken.
 
THX, ich habe es jetzt ein wenig umgebaut.
Als statische Methode ausgelagert, außerdem legt er jetzt einen Zufallswert bereits am Beginn fest.
Jetzt kommt so etwas raus, was schon halbwegs gut aussieht:
http://666kb.com/i/b54rhe0lpi291fa5f.png
("Halbwegs gut" im sinne von "Er tut was", ich weiß das es schlimm aussieht.)
(btw. lol, schaut aus wie ein Drache der gerade hinter einen Vorhang hervorsieht. ^.^)

Das Rote rechts ist nur der Background, hab das Scrollen in die Richtung noch nicht begrenzt.
Allerdings zeigt er jetzt noch komisches Verhalten, was auf einem Fehler hinweißt.
Die neuen Teile sind mit [ b ][ /b ] markiert, da der Java-Tag ja keine anderen formatierungen zulässt.

Java:
package creategame;

import ingame.Terrain;
import ingame.Water;
import ingame.Weed;

import java.util.HashMap;

public class GenerateTerrain extends Object
{
	public GenerateTerrain()
	{
		super();
	}
	public static HashMap<String, Terrain> startGenerate(Variables v)
	{
		HashMap<String, Terrain> terrainMap =
			new HashMap<String, Terrain>();
		
		int x = (int)Math.floor(Math.random() * 50) * 40;
		int y = (int)Math.floor(Math.random() * 50) * 40;
		int rand = (int)Math.floor(Math.random() * 80) + 30; //Zufallslänge bestimmen
		
		terrainMap.put(x + ";" + y, new Weed(x, y, v));
		
		terrainMap = genTerrain(x + 40, y, rand, terrainMap, v);
		terrainMap = genTerrain(x - 40, y, rand, terrainMap, v);
		terrainMap = genTerrain(x, y + 40, rand, terrainMap, v); 
		terrainMap = genTerrain(x, y - 40, rand, terrainMap, v);
		
		terrainMap = fillMapWithWater(terrainMap, v);
		return(terrainMap);
	}
	private static HashMap<String, Terrain> genTerrain(int x, int y, int rand, HashMap<String, Terrain> terrainMap, Variables v)
	{
		rand-= (int)Math.floor(Math.random() * 5);  //Länge um x reduzieren
		
		if(rand <= 0) //Ist länge 0 dann tschüss
			return(terrainMap);
		if(x <= 0 || y <= 0 || x >= 50 * 40 || y >= 50 * 40) //Ist die Tilde außerhalb des Fensters mach Feierabend
			return(terrainMap);
		if(terrainMap.get(x + ";" + y) != null) //Liegt auf der Tilde schon was, dann hör auf.
			return(terrainMap);
		
		terrainMap.put(x + ";" + y, new Weed(x, y, v));
		
		terrainMap = genTerrain(x + 40, y, rand, terrainMap, v);
		terrainMap = genTerrain(x - 40, y, rand, terrainMap, v);
		terrainMap = genTerrain(x, y + 40, rand, terrainMap, v);
		terrainMap = genTerrain(x, y - 40, rand, terrainMap, v);
		
		return(terrainMap);
	}
	private static HashMap<String, Terrain> fillMapWithWater(HashMap<String, Terrain> terrainMap, Variables v)
	{
		for(int i = 0; i < 50; i++)
			for(int j = 0; j < 50; j++)
				if(terrainMap.get(j * 40 + ";" + i * 40) == null)
					terrainMap.put(j * 40 + ";" + i * 40, new Water(j * 40, i * 40, v));
		return(terrainMap);
	}
}

Das komische ist, dass wenn ich die letzte if-Abfrage im genTerrain() entferne, er mir wieder hängen bleibt, und ich will nicht weitermachen solange ich weiß, dass da noch was nicht stimmt.
 
Zuletzt bearbeitet:
Zurück