zwei ints als key in map (ohne long)

H

Hm....

Gast
Hallo,
ich würde gerne zu einem Koordinatenpaar eine id speichern. Das mache ich momentan,
indem ich die zwei Integer zu einem Long zusammen rechne und das ganze als key für eine Map benutz.
Code:
#put((((long)x) << 32) | y, z);
Klappt wunderbar, gerne würde ich das ganze jetzt aber auf Android portieren und so weit ich weiß werden dort Fließkommazahlen nicht nativ von der Hardware unterstützt. Auch wollte ich wegen dem GC vermeiden, lauter 'Point' Objekte zu erstellen oder ähnliches. Mag mir einer einen Tipp geben wie ich das am besten angehe? Das ist für eine 2d tile map, die zu einer Koordinate eine tile id speichert.
MVG Hm...
 
G

Gonzo17

Gast

Und jetzt darf die wilde Spekulation darüber losgehen, was dieses ominöse 'V' bedeutet :D

Ansonsten verstehe ich dein Problem nicht so richtig. Und ich verstehe ehrlich gesagt auch nicht so richtig, was das Stück Code da tut. Aber basierend auf der Aussage

Das mache ich momentan,
indem ich die zwei Integer zu einem Long zusammen rechne und das ganze als key für eine Map benutz

muss ich doch mal fragen - dir ist klar, dass die Koordinaten (1,2) und (2,1) nicht identisch sind, aber den gleichen Key in der Map haben? Warum verwendest du als Key nicht die Koordinaten-Objekte selbst? (was auch immer du da machen willst)
 

Landei

Top Contributor
Und jetzt darf die wilde Spekulation darüber losgehen, was dieses ominöse 'V' bedeutet :D
"Vreundlichen"

muss ich doch mal fragen - dir ist klar, dass die Koordinaten (1,2) und (2,1) nicht identisch sind, aber den gleichen Key in der Map haben? Warum verwendest du als Key nicht die Koordinaten-Objekte selbst? (was auch immer du da machen willst)

In obigen Code werden die ja nicht einfach addiert, sondern mit Bitgeschubse aneinandergehängt - also schon eindeutig.

Einen besseren Rat als eine eigene "Punkt"-Klasse kann ich auch nicht geben (int-Arrays würden nicht funktionieren).
 
G

Gonzo17

Gast
In obigen Code werden die ja nicht einfach addiert, sondern mit Bitgeschubse aneinandergehängt - also schon eindeutig.

Ok, ich hab diese Zeile wie gesagt nicht verstanden, deswegen war mir nicht klar was genau getan wird. Aber meiner Meinung nach ist das nicht sonderlich schön und auch nicht gut nachzuvollziehen.
 
S

Spacerat

Gast
...Klappt wunderbar, gerne würde ich das ganze jetzt aber auf Android portieren...
Dann lass es wie es ist. Wird auf Android auch herforragend (tausche f gegen v :lol:) klappen, denn auch die Dalvik-VM kennt den Datentyp long und ihre Wrapperklasse und was nativ mit denen geschieht ist in jeder anderen VM ja auch völlig uninteressant (die VM macht das schon). Warum es also anders machen wollen?
 
H

Hm...

Gast
[OT]MVG = Mit vielen Grüßen[/OT]

Vielen dank erstmal für eure Ratschläge.
Leider habe ich das Gefühl, ist das Problem welches ich meine noch nicht ganz rüber gekommen.
Ich habe vereinfacht eine gesagt eine World classe mit den functionen:
Java:
public int getWidth();
public int getHeight();
public int setTile(int x, int y, byte id);
public byte getTile(int x, int y);

intern habe ich eine Map, die die tiles auf diese weise speichert:
Code:
tiles.put((((long) x) << 32)|y,id==0?null:id);
Und jetzt der Grund, warum ich ungerne 'point-objecte verwenden würde:
So wird gereedert: (ungefähr)
Java:
	for (int x = (int) (cam.position.x - cam.viewportWidth / 2); x < cam.position.x + cam.viewportWidth / 2; ++x)
			for (int y = (int) (cam.position.y - cam.viewportHeight / 2); y < cam.position.y + cam.viewportHeight / 2; ++y)
				renderCodeFor(x,y,world);

Ungerne würde ich jetzt also für jedes tile erst ein 'point-object' erstellen, um den GC auf dem Handy nicht zu überlasten. Wenn ich also nur ein Brett vorm Kopf habe dann wäre ich froh, wenn mir jemand zwei löcher zum gucken rein bohren könnte :).
MVG hm...
 

Titanpharao

Bekanntes Mitglied
Kann es sein, das du für jedes Objekt das du rendern willst, erstmal dir anhand deiner X/Y Koordinanten das Objekt aus der Map hohlst?
Falls das so ist, kann du das ganz schell vergessen. Das ist nicht nur langsam sondern stinkend lahm :D
Wieso benutzt du nicht einfach ein 2D Array?

Bzw was meinst du mit "'point-objekte"?
Code:
for(int i=0;i<10;++i){
Object a=map.get(i);
}
das macht die Sache nicht langsamer. Also das reine zuweisen und das 'a' "erstellen".
Und wenn du map.put((long) machst, wird daraus auch ein Object nämlich ein Long Objekt.
Maps können nur mit Objekten.
Würde mir aber merh gedanken machen über die Map, hatte meine Sprites auch da zwischengelagert ... nicht schön ... nicht schön^^
 
N

nillehammer

Gast
Ungerne würde ich jetzt also für jedes tile erst ein 'point-object' erstellen, um den GC auf dem Handy nicht zu überlasten.
Code zu schreiben, der unleserlicher wird, nur, weil man angenommene Performanceprobleme umgehen möchte, ist selten eine gute Idee. Obwohl ich Deinen Ansatz, ein Long für zwei ints zu nehmen recht intelligent finde :toll:

Aber, wenn es sich hier um eine offensichtilich zweidimensionale Welt handelt, deren Tiles ein
Code:
byte
enthalten, nimm einen zweidimensionalen byte-Array. Speichereffizienter geht es nicht. Eine Map macht m.E. nur Sinn, wenn die Größe der Welt sich dynamisch ändert. Du hast aber ja konstante Größen oder habe ich das mit dem viewPortWidth und viewPortHeight falsch verstanden?
 
H

Hm...

Gast
Also würde mir hier eher zu so etwas geraten werden: Byte[][] ?.
Eine Map sieht z.b. so aus: (Rot sind dabei die benutzten 'tiles')
01ebfb862e9216a701ec03e19e5d5951
.
Auch können die Maps 'schön' groß werden, da ziemlich viele tiles nicht benutzt werden, erhoffte ich mir mit der HashMap speicher zu sparen.
Ich werde es einfach mal mit einem Array ausprobieren.
(Zu not habe ich hier von einem anderen Project auch noch ein 'chunk-world' System. Aber das wäre dann wohl die Kanone für den Spatzen)
MCG hm...
 
N

nillehammer

Gast
Also würde mir hier eher zu so etwas geraten werden: Byte[][] ?.
Nein, eher zu
Code:
byte[][]
. Jedenfalls habe ich das aus dem hier geschlossen:
Java:
public int setTile(int x, int y, byte id);
Der Gag ist eben, dass Du in einer Map mit Wrappern arbeiten musst, während Du in einem Array mit Primitives arbeiten kannst.
da ziemlich viele tiles nicht benutzt werden, erhoffte ich mir mit der HashMap speicher zu sparen.
Das kann tatsächlich so sein. Das mit den vielen unbenutzten Tiles hatte ich jetzt so aus den bisherigen Infos nicht erkennen können.

Nochmal zusammengefasst die Punkte, die man vielleicht bedenken sollte:
- Deine longs werden per Autoboxing sowieso in Instanzen von Long umgewandelt. Gegenüber einer eigenen Point-Klasse mit zwei ints als Instanzvariablen vermeidest Du also weder Objekterzeugung noch Garbage Collection. Und Speicher sparst Du auch nicht wirklich.
- Eine eigene Point-Klasse ist auf jeden Fall verständlicher als das Bit-Geschiebe
- Eine eigene Point-Klasse erfordert aber wiederrum Schreibarbeit: Getter, Setter(wenn sie mutable sein soll), equals/hashCode müssen stimmen etc. Das sparst Du Dir bei den longs natürlich.
- Ein Array von Primitives spart Speicher gegenüber der gleichen Anzahl von Wrapper-Instanzen.
- Bei einer großen World mit vielen unbenutzten Tiles kann es tatsächlich sein, dass Du mit einer Map trotz Wrapper-Instanzen sehr viel weniger Referenzen speicherst als mit einem Array.

Sieh die hier geposteten Ansätze vielleicht mehr als Ideen, aus denen Du für Deinen Anwendungsfall den richtigen auswählen kannst.
 

Titanpharao

Bekanntes Mitglied
Das sollte auch nicht mehr Speicher benötigen, wenn du wirklich
Byte[][] world=new Byte[10][10];
machst.
Denn überall ist "null" und somit kein Speicher.
Somit würde ich die freien Plätze auch wirklich null lassen.
Würde mir auch noch eine echte WorldTile Klasse oder ähnliches schreiben, da Byte doch wenig Eigenschaften haben kann, falls sowas noch kommt.

Und hier mein abschließender Tipp, 1024x1024 Byte große Map ergeben 1MB :) Was verschwindend gering ist, lädst du ein Bild ist es schon viel größer. Oder ist die doch größer^^
Wie sagte mal unser Lehrer, Speicher != Performance oder anders rum. Nimmst du das Array ist es schneller, womöglich größer(wegen leer). Nimmst du die Map kannst du vllt Speicher einsparen, aber die Performance ist im Keller.
 
H

Hm...

Gast
Dann werde ich jetzt erstmal ein Array benutzen und erst wenn es zu Problemen kommt wechseln.
(Ich habe hier ein ziemlich schlechtes Handy, wenn es hier läuft, läuft es auf deinem Taschenrechner ;)).

Zu der eigenen 'WorldTile' classe. Meine Tiles sind doch alle recht statisch, haben eine 'Form' und eine Textur (+id), existierend als Singleton.

Vielen dank nochmal.
Hm...
 

Landei

Top Contributor
Vielleicht wäre auch ein Quadtree etwas für dich, insbesondere wenn du die Kartengröße quadratisch und gleich (oder knapp unterhalb) einer Zweierpotenz festlegen kannst.
 
Zuletzt bearbeitet:
H

Hm...

Gast
Ich bleibe erstmal bei dem array, bis jetzt macht es seinen job ganz gut. Sollte es zu Problemen kommen, werde ich sowohl den Quadtree als auch die Map nochmal implementieren.
Hm...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S intersect von zwei Rechtecken Spiele- und Multimedia-Programmierung 8
N Kollision von zwei ImageIcons Spiele- und Multimedia-Programmierung 8
E Zwei Threads miteinander laufen lassen Spiele- und Multimedia-Programmierung 6
S 3D-Kollision mit zwei ArrayLists Spiele- und Multimedia-Programmierung 7
F Java zwei gleiche Threads mit unterschiedlichen Parametern Spiele- und Multimedia-Programmierung 2
P Sound auf zwei Lautsprechern getrennt abspielen Spiele- und Multimedia-Programmierung 9
B 1)JButtons zeichnen 2)Kolisionsabfrage von zwei Objekten Spiele- und Multimedia-Programmierung 9
V Winkel zwischen zwei Vektoren Spiele- und Multimedia-Programmierung 1
A Mit KeyListener zwei Tasten gleichzeitig abfragen Spiele- und Multimedia-Programmierung 2
D Zwei Fragen (Exponential Fog und Schein-nach-außen-Effekt) Spiele- und Multimedia-Programmierung 6
Redfrettchen Tastatur für zwei Spieler teilen? Spiele- und Multimedia-Programmierung 8
E Programmierung eines 2.5D Point&Click Adventures ohne Spieleengine machbar? Spiele- und Multimedia-Programmierung 14
J Bild ohne Quallitätsverlust skalieren Spiele- und Multimedia-Programmierung 11
E Rotation um Bildmittelpunkt ohne Affine Transform!!!!! Spiele- und Multimedia-Programmierung 13
A 2D Spiel ohne Tiles Spiele- und Multimedia-Programmierung 10
S Mausklicks innerhalb eines JFrames/SWTBrowser ohne richtige Maus simulieren Spiele- und Multimedia-Programmierung 6
B Bild ohne Image auf die Festplatte streamen Spiele- und Multimedia-Programmierung 4
Devil0s 2D Stadt Generator/2D Welt speichern OHNE Tiles Spiele- und Multimedia-Programmierung 5
M Multiplayer Game mit Frontend auf HTML5 - ohne ständigen Client Request - Möglich?! Spiele- und Multimedia-Programmierung 12
S Sounds abspielen, ohne sie jedesmal neu zu laden Spiele- und Multimedia-Programmierung 8
B Bilder in GUI ändern ohne repaint() Spiele- und Multimedia-Programmierung 6
C java 3d ohne Java3d Spiele- und Multimedia-Programmierung 28
H Skalierung eines Polygons ohne das es verschoben wird Spiele- und Multimedia-Programmierung 3
K Java3D als Applet ohne Installation von Java3d Spiele- und Multimedia-Programmierung 6
M Eigene Renderengine ohne Java3D,etc. Spiele- und Multimedia-Programmierung 19
M Aktien-Spiel ohne GUI Spiele- und Multimedia-Programmierung 28
aze Java3D: Gegenstände aufeinander zubewegen ohne Kollision Spiele- und Multimedia-Programmierung 4
A JMF ohne Installation Spiele- und Multimedia-Programmierung 4
Developer_X Sound Lautstärke ohne spezifische API regulieren Spiele- und Multimedia-Programmierung 3
L JMF Player spielt mp3 nur ohne Ton Spiele- und Multimedia-Programmierung 14
M Binärbaum ohne Überlappung zeichnen Spiele- und Multimedia-Programmierung 3
T 3D-Tetris Feld neuzeichnen ohne neue Branchgroup Spiele- und Multimedia-Programmierung 18
O Java3D-Applet ohne Java3D-Runtime ausführen Spiele- und Multimedia-Programmierung 2
L klick auf ComboBox ohne ActionListener --> CPU ausgelaste Spiele- und Multimedia-Programmierung 13
H Tic Tac Toe / 3 Gewinnt OHNE Applet Spiele- und Multimedia-Programmierung 9
S 3D Objekte ohne Java3D darstellen? Spiele- und Multimedia-Programmierung 10
B Sudoku Generator ohne Solerver möglich? Spiele- und Multimedia-Programmierung 20
G Farbig zeichnen ohne java.awt.Color? Spiele- und Multimedia-Programmierung 5

Ähnliche Java Themen

Neue Themen


Oben