Autor Beitrag
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Mi 02.10.02 03:05 
Hi,

ich bin im moment daran ein Spiel zu programmieren, und sitze gleich zu anfang vor einem nicht unlösbaren problem.. aber es ist ein problem mit vielen lösungsmöglichkeiten.

und ich würd mal gern eure meinung wissen.

Also,
mein Spiel ist aufgebaut wie ein Strategiespiel, sicht von schräg oben etc. und aufgebaut ist das spielfeld in 10.000x10.000 Kästchen.

Bisher hab ich es so gemacht, das beim starten das Spielfeld in einen Array (Array[1..10.000,1..10.000]) geladen wird, und zwar aus einer Textdatei in der in jeder Zeile die information für jeweils ein kästchen stehen.

Klappt auch gut soweit, einzig und alleine die Ladezeit ist extrem lang...
Das ganze spiel ist so gemacht, das immer nur die kästchen gezeichnet werden, die auch wirklich sichtbar sind... also nicht immer alle 10.000x10.000 stück. und da dachte ich mir nun ich könnte irgendwie immer die aktuell sichtbaren kästchen aus der Textdatei laden (ohne den Array umweg vorher). Nur bevor ich das nu mache würd mich mal interressieren ob es etwas bringt :)

Wie lange dauert es, in einer Textdatei die 100.000.000 Zeilen hat den Cursor z.B. an den anfang der 97.173.177 Zeile zu setzten und von daaus dann 100 Zeilen auszulesen.
dauert es länger als sagen wir ne 10tel Sekunde??? (Es muß halt schneller, oder zummindest gleichschnell sein als wenn ich einfach aus dem Array 100 Felder auslese).

wäre super wenn mir da jemand helfen könnte, auch für weitere vorschläge wäre ich sehr dankbar.

Au'revoir,
Aya
Indeterminatus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47



BeitragVerfasst: Mi 02.10.02 14:27 
Hallo Aya!

Das Problem, das Du hier ansprichst, hatte ich auch einmal, nur halt nicht in ganz so großem Umfang :wink:

Ich kann Dir jetzt nicht garantieren, dass das der beste Lösungsweg ist, es ist halt nur so, wie ich es probiert habe ...

Angenommen, es sind immer 20 x 20 Felder sichtbar. Wenn nicht alle Felder ständig miteinander in Verbindung stehen müssen, ist es übertrieben, alle 100.000 Felder in den Speicher zu laden, obwohl Du maximal 400 (20x20) benötigst.
Ein kleiner Tipp vorweg: Speicher Deine Karten NICHT als TextFile ab, weil Du den Dateicursor nicht mehr gezielt positionieren kannst.
Eine gute Alternative dazu wäre eine binäre Datei mit 1 Byte Größe / Feld.
Dies gilt jetzt natürlich nur, wenn Du auch nur 1 Byte / Feld benötigst.
Solltest Du mehr Informationen speichern wollen, würde ich Dir die Verwendung der sogenannten TileSet-Methode empfehlen, damit kannst Du immens viel Speicher sparen (und zwar nicht nur im Arbeitsspeicher, sondern auch auf der Festplatte, was wiederum kürzere Lade- u. Speicherzeiten mit sich ziehen würde!)

So weit, so gut. Ich werde jetzt wieder auf Dein ursprüngliches Problem näher eingehen.
Es ist auch nicht besonders schlau, immer nur die Felder in den Speicher zu laden, die derzeit auf den Bildschirm gezeichnet werden müssen.
Das würde bedeuten, dass Du jedesmal, wenn der Spieler um ein Feld (in welche Richtung auch immer) scrollt, die aktuellen Felder abspeichern und die neuen Felder laden müsstest (bzw. die Felder, die aus dem Bildschirmbereich verschwinden speichern und die "neuen" Felder zu laden)...
Ich hatte eine 500x500 große Karte, jeweils 16x16 Felder angezeigt (Größe eines Feldes war 32x32 Pixel). Meine Engine lud jeweils 100x100 Teile in den Speicher, und zwar so, dass die 16x16 "Bildschirmfelder" möglichst zentriert waren.
Entfernte sich der Spieler zu weit vom Mittelpunkt der 100x100-Grenze (so etwa nur mehr 10 Felder vom Ende des Arrays entfernt), wurde die Position des 1. Feldes (sprich: linke obere Ecke) verschoben und die Felder neu geladen.
Mit einer Binärdatei ist das soweit kein Problem, weil Du den Dateizeiger direkt auf ein Element positionieren kannst.

Grundsätzlich gilt: Lade möglichst nur einmal von der Festplatte, weil der Zugriff auf HD um einiges langsamer läuft als der Zugriff auf RAM.
Ein 10.000 x 10.000 großes Byte-Array würde 100.000 Bytes aufbrauchen, das sind umgerechnet etwa 98 Megabyte !!! Und das allein für die Karte !!!
Ich schätze mal, Du hast noch Einheiten und sonstige Objekte auch, die sicher auch schon genug verschlingen.

Wie schnell genau der Festplattenzugriff beim Auslesen von 1000 Bytes vonstatten geht, kann ich Dir nicht sagen. Zum ersten, weil ich es nie gemessen habe, und zum zweiten, weil das sehr stark vom System abhängt, auf dem Du diesen Test machst, also würden Dir meine Werte wahrscheinlich sowieso nicht weiterhelfen ...

Ich hoffe, ich konnte Dir etwas weiterhelfen ... wenn Du noch irgendwelche Fragen hast ... well, feel free to ask :wink:

Ich wünsche Dir viel Spaß und Erfolg mit Deinem Spiel!

_________________
_______________________________________
Indeterminatus

---=si tacuisses, philosophus mansisses=---