[GELÖST] array:+[...]

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Boris1993

Betreff: [GELÖST] array:+[...]

BeitragMi, Aug 01, 2012 18:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo

ich möchte einem array, das einem vbo dient mehrere millionen werte hinzufügen. erst habe ich das array so deklariert array[100000000]. 100 millionen damit das programm nicht über den array hinausgeht. das frisst natürlich viel speicherplatz. dann habe ich aber rausgefunden, dass man mit array:+[zahl] einen wert hinzufügen kann ohne voher eine grenze festgelegt zu haben. bei 10000 werten klappt das auch einwandfrei aber sobald man in die million bereiche geht bleibt das programm stecken. warum ist diese methode so unglaublich langsam? kann man das irgendwie umgehen?

hier mein testcode:
Code: [AUSKLAPPEN]
SuperStrict
Global arr:Float[]

For Local i:Int = 0 To 1000000
   arr:+[RndFloat()]
Next

For Local i:Float = EachIn arr
   Print i
Next



Danke für Hilfreiche Antworten Smile

Lg
Boris
  • Zuletzt bearbeitet von Boris1993 am So, Aug 05, 2012 14:29, insgesamt einmal bearbeitet

ZaP

BeitragMi, Aug 01, 2012 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Arrays müssen im Speicher zusammenhängend sein. Ich vermute, wenn Du das Array mit BlitzMax erweiterst, wird intern ein neues, größeres Array angelegt und neu befüllt, das dauert natürlich.
Eine Umgehung bieten da Listen, aber viele Millionen Elemente kommen mir sehr krumm vor. Vielleicht solltest Du eher versuchen, irgendwo etwas zu optimieren.
Starfare: Worklog, Website (download)
 

Boris1993

BeitragMi, Aug 01, 2012 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
das array muss für ein voxelterrain sehr viele vertices speichern und zwar für jedes den x, y, z wert daher geht es schon bei der momentanen größe des terrains im schnitt über 6.000.000. aber du hast natürlich recht optimiert werden kann da noch viel. naja wenn ich bei 10.000.000 die grenze setze brauchts auch nich soviel speicher sobalds im vbo landet kann ich das array eh wieder löschen

Mit Listen wollte ichs auch schon versuchen, nur hab ich nicht hinbekommen mit list.toarray() in ein float array zu casten wenn jemand weiß wie das geht würd ich mich um eine antwort freuen Smile

danke für die schnelle antwort

ZaP

BeitragMi, Aug 01, 2012 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Das sind natürlich eine Menge Vertices und bin bin mir gar nicht sicher, ob dass herkömmliche Desktop-Grafikkarten überhaupt rendern können.
Du müsstest dir vielleicht ein LOD System basteln, so dass nur in Spielernähe Details vom Terrain sichtbar sind.
Ansonsten kannst Du dir ja noch überlegen, ob Du überhaupt immer das gesamte Terrain im Speicher brauchst, oder ob das ein Thread nicht von der Festplatte nachladen könnte.
Starfare: Worklog, Website (download)

Thunder

BeitragMi, Aug 01, 2012 21:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie schon gesagt ist das ganze langsam, weil um einen Wert anzuhängen, ein neues Array erstellt und das alte verworfen wird (= extrem ineffizient, wenn du viele kleine Elemente anhängst). Es geht also gar nicht darum, dass 10.000.000 Elemente zu viel wären. Das kannst du z.B. so umgehen, dass du im Vorhinein schaust, wieviele Werte du speichern wirst und das Array mit einer festen Größe initialisierst:
BlitzMax: [AUSKLAPPEN]
arr = New Float[1000001]
For Local i:Int = 0 To 1000000
arr[i] = RndFloat()
Next


Außerdem könntest du auch den Speicher selbst verwalten, entweder über MemAlloc und seine Freunde oder über Banks. Dabei musst du dann so vorgehen, dass du immer etwas mehr Speicher reservierst als notwendig und wenn er gefüllt ist, dann reallozierst du und nimmst wieder etwas mehr Speicher als unbedingt nötig.
 

Boris1993

BeitragMi, Aug 01, 2012 22:59
Antworten mit Zitat
Benutzer-Profile anzeigen
ja so habe ich das auch überlegt mit dem vortesten wieviel speicher benötigt. danke für eure antworte wieder was gelernt. Wink das mit memalloc und banks werd ich mir mal anschauen. achja und soviel speicher wird das programm später nichtmehr brauchen das war nur zu testzwecken wie weit ich das programm schon ausreizen kann. bei ca 8000000 cubes hatte ich 40 fps. das programm speichert nämlich nur die würfelflächen, die nicht von anderen cubes verdeckt sind. und ja über ein lod system habe ich auch schon nachgedacht und bin auf den sparse voxel octree gestoßen den ich vielleicht irgendwann mal in mein programm einbringen werden, aber eigentlich denke ich das wird nichtmal nötigsein.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group