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

Boris1993Betreff: [GELÖST] array:+[...] |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() Lg Boris |
||
- Zuletzt bearbeitet von Boris1993 am So, Aug 05, 2012 14:29, insgesamt einmal bearbeitet
![]() |
ZaP |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() danke für die schnelle antwort |
||
![]() |
ZaP |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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] 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ja so habe ich das auch überlegt mit dem vortesten wieviel speicher benötigt. danke für eure antworte wieder was gelernt. ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group