[Gelöst]Optimalstes 4D array?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

AnniXa

Betreff: [Gelöst]Optimalstes 4D array?

BeitragDi, Dez 08, 2009 10:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey, ich hätte mal eine frage =)

welches wäre eurer meinung nach die optimalste (schnellste und speicherschonendste) vaeriante 4Dimensionale daten zu speichern, in diesem speziellen fall:

Es handelt sich in diesem fall um eine 3D Map:
Code: [AUSKLAPPEN]

Map[x,y,z]

jedoch möchte ich pro position 2 daten speichern. wie ginge das nun am besten?
das array um eine 4 dimension erweitern?
Code: [AUSKLAPPEN]

Map[x,y,z,a] ( Map[worldX,worldY,WorldZ,2]  )

oder lieber ein type mit 2 feldern in den array tun?
Code: [AUSKLAPPEN]

type dings
field A:int
field B:int
end type
Map[x,y,z]:dings

oder das ganze in 2 arrays aufteilen?

Code: [AUSKLAPPEN]

MapA[x,y,z]
MapB[x,y,z]


welches wäre der beste weg? wie würdet ihr das machen?
|moonForge|
Ich bin Pokémon Meisterin seit 1998!
  • Zuletzt bearbeitet von AnniXa am Sa, Dez 12, 2009 6:59, insgesamt einmal bearbeitet

coolo

BeitragDi, Dez 08, 2009 10:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde die Variante mit den Types verwenden.
Warum? Die Variante mit den Types ist eindeutig flexibler, und OOPiger.

Btw. Ein Array aus Types erstellt man so:
Code: [AUSKLAPPEN]
Local MeinArray:TMeinType[,]=New TMeinType[10,10]
http://programming-with-design.at/ <-- Der Preis ist heiß!
That's no bug, that's my project!
"Eigenzitate sind nur was für Deppen" -Eigenzitat
 

Ava

Gast

BeitragDi, Dez 08, 2009 14:27
Antworten mit Zitat
Eine andere Möglichkeit, die ich bevorzugen würde, wäre noch:
BlitzMax: [AUSKLAPPEN]
Gloabl Map:Int [ ab ] [ x, y, z ]
 

BBPro2

BeitragDi, Dez 08, 2009 16:40
Antworten mit Zitat
Benutzer-Profile anzeigen
er fragte nach der schnellsten und speicherschonensten variante,
nicht nach der variante die am einfachsten zu erweitern ist (oop)

die antwort auf die frage lautet : eine 4. dimension dem array hinzufügen

also
map [x, y, z, datenebene]

DAK

BeitragDi, Dez 08, 2009 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hab das ganze mal durchgetestet und bin zu einem intressanten ergebnis gekommen:

Code: [AUSKLAPPEN]
Global test:Int[100,100,100,2]
verbraucht (laut Taskmanager) 9.852 k, wenn mittels Framework brl.system nur das nötigste reingeladen wird.
Code: [AUSKLAPPEN]
Global test1:int[100,100,100]
Global test2:int[100,100,100]
braucht knapp mehr, nämlich 9.864 k
der oop-ansatz mit
Code: [AUSKLAPPEN]
Type T2
   Field x:Int,y:Int
End Type

Global test:T2[,,]=New T2[100,100,100]
braucht intressanterweise aber nur 5.944 k.

geschwindigkeit hab ich nicht getestet, aber was speicherverbrauch angeht is die oop-lösung intressanterweise wirklich die schnellste.

btw, @bbpro2: annixa ist immer noch weiblich Wink
Gewinner der 6. und der 68. BlitzCodeCompo

D2006

Administrator

BeitragDi, Dez 08, 2009 17:24
Antworten mit Zitat
Benutzer-Profile anzeigen
DAK:
Dein Array of T2 is ja auch noch leer, also da steht überall nur null drin.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Tankbuster

BeitragDi, Dez 08, 2009 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Es geht doch auch mit 2 Dimensionen:

Warum nicht so

Code: [AUSKLAPPEN]
Map[ID,Field]


ID gibt die ID des Verticles (oder was auch immer) an. In Field werden dann Sachen wie XYZ-Position, und die Daten gespeichert. (ähnlich wie bei Types)

Code: [AUSKLAPPEN]
Map[1,1]

wäre dann zum Beispiel die X-Position des ersten Verticles Wink

Ob das ganze so speicherschonend ist, weiß ich natürlich auchnicht. Laughing
Twitter
Download Jewel Snake!
Windows|Android

D2006

Administrator

BeitragDi, Dez 08, 2009 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Öhm, der Sinn solcher Sachen wie Tilemaps ist ja gerade, dass wir durch die Position des Objekts zu diesem selbst kommen. Nicht umgekehrt! Sonst müssten wir ja alles durchgehen, um allein herauszubekommen, was gerade auf dem Bildschirm zu sehen ist.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Casiopaya

BeitragDi, Dez 08, 2009 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Im Hinblick auf Speicherverbrauch sind die beiden gut:

Code: [AUSKLAPPEN]
Global test:Int[100,100,100,2]


Code: [AUSKLAPPEN]
Global test1:int[100,100,100]
Global test2:int[100,100,100]


Wobei die 1. Methode hier eindeutig vorzuziehen ist. Eine Erweiterung um einen 3. Wert (auch Int) wäre einfach:

Code: [AUSKLAPPEN]
Global test:Int[100,100,100,3]


Man kann beim Sprung von 2 auf 3 den bisherigen Code i.Ü. auch unverändert lassen. Das Ändern der letzten Array-Dimension stellt eigentlich nie ein Problem dar.


Code: [AUSKLAPPEN]
Type T2
   Field x:Int,y:Int
End Type

Global test:T2[,,]=New T2[100,100,100]


Ist dann nötig und sinnvoll, wenn die Zusatzinformationen ein-zwei Integer übersteigen und komplexer werden (Zudem wenn Variablen eines Typs ungleich Int gespeichert werden sollen). Ich würd diesen Weg aber nur gehen, falls die Informationen wirklich komplexer werden, ansonsten hat man unnötigen Speicherverbrauch und vor allem schlechtere Performance.
 

BBPro2

BeitragMi, Dez 09, 2009 0:35
Antworten mit Zitat
Benutzer-Profile anzeigen
unnötiger speicherverbrauch und schlechte performance - dafür ordentliche
übersicht und "extrem einfache" erweiterbarkeit (einfacher als funktional zumindest)

klingt doch nach oop Wink

is halt die frage was man grade braucht

Casiopaya

BeitragMi, Dez 09, 2009 7:32
Antworten mit Zitat
Benutzer-Profile anzeigen
BBPro2 hat Folgendes geschrieben:
unnötiger speicherverbrauch und schlechte performance - dafür ordentliche
übersicht und "extrem einfache" erweiterbarkeit (einfacher als funktional zumindest)

klingt doch nach oop Wink

is halt die frage was man grade braucht


Stimme absolut zu. Kommt drauf an wie wichtig die erwähnten Komponenten wie Performance sind (relativ zum Rest des Programms).

D2006

Administrator

BeitragMi, Dez 09, 2009 9:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Also bitte, ich glaub euch gern, dass die reine Array-Methode ein wenig performanter ist. Aber niemals ist die viel saubere Type-Methode merklich langsamer, vorallem nicht so sehr, wie ihr es hier darstellt. Ich würde diese zu jeder Zeit vorziehen.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Noobody

BeitragMi, Dez 09, 2009 10:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem liegt hierbei halt beim Garbage Collector. Bei der Type-Methode erstellt man je nach dem tausende Instanzen des Types, was einen herben Einschlag auf die Geschwindigkeit haben kann, wenn der GC anspringt (vor allem dann im Multithreaded-Build). Ausserdem ist es ziemlich mühsam, jeden einzelnen Eintrag des Arrays nachträglich mit neuen Type-Instanzen zu füllen - da gefällt mir die 4D-Array-Methode doch gleich viel besser.

Falls nun noch andere Datentypen als Int dazukommen würden, würde ich natürlich die Type-Methode bevorzugen, aber in diesem Falle hat das blosse Array einen Vorteil in der Handhabung, Geschwindigkeit und Speicherverbrauch.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

AnniXa

BeitragDo, Dez 10, 2009 0:31
Antworten mit Zitat
Benutzer-Profile anzeigen
danke für die tipps =)
ich habe es nun auch mit einem "stinknormalen" 4d array gemacht.

erweitert soll es später nicht werden, jedenfalls wüste ich jetzt nicht wie,und wenn dann vergrößere ich einfach den maximal wert des letzten array.
|moonForge|
Ich bin Pokémon Meisterin seit 1998!

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group