Riesige Datenmengen im Prog unterbringen
Übersicht

onkelz89Betreff: Riesige Datenmengen im Prog unterbringen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi,
ich beschreib erstmal kurz was ich machen will: - eine noch unbestimmte Zahl an Teillevels (später klar) - in jedem Level werden ca. 10t-30t Types neu geladen (und die alten vom vorlevel gelöscht) - nur wie werden jetzt die neuen 10t-30t Types geladen??? Wenn ichs in Dateien speichere dann dauert das Laden ewig... Gibt es in Blitz eine Möglichkeit für die Speicherung großer Daten und möglichst kein Speicherfresser... ###EDIT (hab nich viel Zeit leider deswegen schreib ich etwas unverständlich...) Die Leveldaten müssen also möglichst schnell IMMER vorhanden und geladen sein nur nicht in Types, da es viel viel zu lahm würde... UND man muss alles von den Daten wieder verändern können, koords, energie usw. Speicherung/Ladung erfolgt immer zwischen 2 Abschnitten Danke im Vorraus |
||
Lumooja |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich würde folgende Möglichkeiten in Betracht nehmen:
A) Gemeinsame Typen im Speicher (=RAM) lassen, und nur die wirklich unterschiedlichen Typen von Platte laden bzw. aus dem Speicher entfernen. B) Benachbarte Typensätze (z.B. Zones oder Levels) im Speicher halten, und womöglich noch mit dem 7Zip (besser als RAR (und ZIP sowieso)) Algorithmus in den Speicher komprimiert abspeichern. C) A und B kombiniert, dazu noch die Daten auf Platte 7Zippen, oder vielleicht sogar alles 7geZippt im Speicher haben ![]() Aber in der Praxis mit dem einfachsten anfangen, denn verlieren kann man dabei nichts. |
||
- Zuletzt bearbeitet von Lumooja am Di, Jul 10, 2007 14:58, insgesamt einmal bearbeitet
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
das zauberwort ist streaming, lade nur das was du wahrscheinlich blad brauchst.
ist ein riesen aufwand sowas! |
||
between angels and insects |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
erst Mal würde ich mir überlegen was du überhaupt genau willst.
hier werden types geladen, da werden welche geladen ... Ich glaub du verstehst schon die grundlegenden Sprachkonzepte nicht solange du "Types" lädst oder auch nur etwas ähnliches. Drum erst Mal überlegen was hast du, was brauchst du und zwar klar spezifizieren. Dann kann man dir vielleicht sinnvolle Vorschläge geben. Bis dahin: Streaming wird das sein was du brauchst. Es gibt keine Magie die 100MB an Daten zu 1MB machen und 7Zip etc sind auch nur bedingt eine Lösung, denn Meshes etc können nur von der Platte geladen werden sofern du nicht selbst die daten ausliest und on the fly ein Mesh generierst (was etwas von dem sein wird was du machen musst) |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
onkelz89 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für die Tipps.
Geht leider nicht so ganz. Also die vorschläge mit dem Übernehmen geht nicht, das es definitiv immer verschiedene sind die nichts miteinander zutun haben Mit dem 7Zip geht glaub auch nicht... Man müsste es ja zum bearbeiten ständig entpacken und packen.. was wiederum zu geschwindigkeitsverlust führt (man müsste halt testen wie lange und kann blitz sowas?) Streaming geht auch nicht leider, da ich alle 10t-30t Types brauch ![]() PS: das heißt nicht dass alle Types jede Sekunde auch durchlaufen werden, aber es kann jede Sekunde dazu kommen... ##Edit Nicht falsch verstehen ich möchte nicht 100 zu 1 mb machen. nur wenn ich ca. 300t Types ständig habe, wird das extrem lahm. Es muss doch ingame andere möglichkeiten geben... nur schnellere und weniger Ram-fressend |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nochmal, es geht nicht.
Entweder du machst es Streaming so das nur im RAM ist was gebraucht wird oder du hast 2GB RAM Verschleiss während dem editieren und bringst dem Spiel streaming bei. Denn was im Editor läuft muss net zwangsweise das gleiche sein wie beim Enduser. Und nur so als randbemerkung: Es heisst k nicht t für "kilo" = tausend (genau genommen 1024) |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Lumooja |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Klar, die 30t Daten (meinst du sowas wie 30000 mal die Größe eines Datensatzes, z.B. 30000 * 16 Bytes?) müssen schon als B3D variablen vorhanden sein (also mit "New Type" als Liste angelegt). Mit dem 7Zip hab ich nur gemeint das das damit schneller gehen würde die nächsten "30000*16" Bytes von Platte zu lesen, außer wenn alle die 30t Datensätze gepackt in the Speicher passen, dann gehts halt noch schneller als von Platte zu lesen.
Jetzt hab ich auch noch den Verdacht, daß dein eigentliches Problem nur die Zeit ist, in der eine 300000 lange liste durchgewühlt wird. Dann kannst du doch nur ganz einfach 10 seperate 30000 listen angelegen (oder einen Anfangs- und Endpointer der zu lesenden Untermenge in der Liste festlegen), oder reicht dann den Speicher nicht aus? |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Irgendwie komme ich nicht ganz dahinter, wozu du überhaupt so viele Types benötigst. Keine Ahnung wie du die Levels aufbaust, aber wenn 10000 - 30000 Types (mit wie vielen Fields durchschnittlich?) verwendet werden, würde ich doch erst mal versuchen, diese Leveldateien so klein wie möglich zu halten.
Bei zu großen Datenmengen wirst du wohl ein Load-Screen verwenden müssen - oder versuchen Threaded-loading zu realisieren wenn das spiel das grundsätzlich hergibt. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
ByteCroc |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Du schreibst oben das du die Daten in Types hast, dann sollen sie aber doch nicht in Types sein, da sie zu langsam sind.
Arrays sind schneller, wenn du Konstanten einrichtest kannst du sie auch mit einem Namen ansprechen Const ENERGIE 10 Dim Feld(30000) x = Feld(ENERGIE) In einer For Next Schleife durchlaufen lassen zum abspeichern. Oder alles erst in eine Bank packen und abspeichern, die Bank lädt und speichert evtl. schneller, aber das musst du austesten. |
||
onkelz89 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Die 30.000 Types sind durchschnittlich mit 40 Fields belegt.
Es sind nicht nur Leveldaten wie zB (Wände,Türen usw) Es sind auch Objekte im Level, Menschen, Tiere eigentlich alles was in dem Bereich anzutreffen ist. Man kann aber zB ein Objekte "mitnehmen" dann ist es nichtmehr in dem Level sondern im Nächsten. Die Types sind nur Objekte / DInge alles was im MOMENTANEN Level ist. Die Restlichen Daten(werden beim Laden in Types umgewandelt) sollen anders gespeichert werden. Ich weiß nicht was mit dem 7Zip gemeint ist. Wie kann ich 7Zip Dateien in den Ram laden und dann daraus Dateien laden.. aus denen ich dann Werte auslese gibts dafür ein Tut? Mit der Menge naja... es sind nunmal leider soviele.. falls es irgendwie möglich ist und ich das Problem weniger habe werdet ihr mich nach der ersten Demo verstehen ![]() Hoffe es gibt da neMöglichkeit sonst müsste ich das "Gesamtpacket" abspecken... |
||
Lumooja |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
onkelz89 hat Folgendes geschrieben: Ich weiß nicht was mit dem 7Zip gemeint ist. Wie kann ich 7Zip Dateien in den Ram laden und dann daraus Dateien laden.. aus denen ich dann Werte auslese gibts dafür ein Tut?
Dafür müßte man Betriebssystem API's verwenden, z.B. auf Windows: GlobalAlloc(), GlobalLock(), RtlMoveMemory(). Diese kann man dann einfach in einer .decls in Blitz3D definieren. Da 7Zip Open Source ist, gibst dafür auch source code, aus den man den pack- und entpackalgorithmus in eine .DLL Datei für Blitz3D schreiben müßte (Entpacken: Funktion die die Anfangsaddresse und Länge der gepackten Daten nimmt, und Anfangsadresse und Länge der entpackten Daten liefert; Packen: Funktion die eine Anfangsaddress und Länge nimmt, und Anfangsaddresse und Länge der gepackten Daten liefert). Das wird warscheinlich ziemlich mühsam sein, und wenn ich das schreiben würde, könnte das schon ein paar Wochen dauern ![]() Außerdem sehe ich das ganze garnicht so sinnvoll das es die Mühe wert wäre, da jeder genutzte Speicher den Rechner sowieso verlangsamt, sei es noch so gut gepackt. Jetzt hab ich eine neue Idee: eine .DLL in C für Blitz3D schreiben die "fread(buffer,16384,1,f);" benutzt. Damit geht das lesen von Platte wahnsinnig schnell. Ich hab vor einiger Zeit ein Test-Programm mit dem entsprechenden "fwrite();" geschrieben, und es schreibt eine Datei der Größe 100,000,000 Bytes in 0.078 Sekunden auf einem Server, und in 8.5 Sekunden auf meinem alten Laptop. Lesen hab ich noch nicht getestet, aber es dürfte noch viel schneller sein. EDIT: Gerade getestet: lesen von 100,000,000 Bytes Datei (=95MB) geht in 0.12 Sekunden auf meinem Laptop. PS. Wen's interessiert, hier ist der C source code für das schreiben: Code: [AUSKLAPPEN] #include <stdio.h>
#include <windows.h> #define bs 16384L #define xs 1024L int main(int argc, char **argv) { unsigned long ms=0L; char s[bs]=""; char filename[254]="test.dat"; printf("fwrite 0.0\n"); FILE *f; if (argc<3) { printf("fwrite <filename> <bytes>\n"); return(1); } else { strcpy(filename,argv[1]); ms=atol(argv[2]); } double t1=GetTickCount(); f=fopen(filename,"wb"); int done=0; unsigned long i=0L; while(done==0) { fwrite(s,bs,1,f); i+=bs; if((i%(bs*xs))==0) { printf("%.18ld\r",i); //Sleep(80); } if ((unsigned long)i+bs>=ms) done=1; } fwrite(s,ms-i,1,f); printf("%.18ld\n",ms); fclose(f); double t2=GetTickCount(); printf("Done. Time Elapsed: %f seconds. %f bytes per second.\n",(t2-t1)/1000.0,ms/((t2-t1)/1000)); } |
||
Marek |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Du meinst mit 10t also schon 10 Tausend und nicht 10 Terra, oder? Der Unterschied:
10 Tausen (10k)= 10*1000 10 Terra (10t)= 10*1000000000000 (dazwischen kommen noch Mega(m) und Giga(g), sollten bekannt sein) MfG Marek |
||
Wer lesen kann ist klar im Vorteil... |
onkelz89 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
OK erstma vielen dank für die Tipps und Hilfen.
Problem ist nur ich hab kein Programm womit ich Dll erstellen kann bzw. man braucht doch ein Programm um in C zu programmieren oder? Hab vor langer Zeit mal damit experimentiert. Wie kommt es überhaupt das der Befehl dann soviel schneller ist. Und wie sieht es bei 10000 dateien aus die jeweils nur 90 kb klein sind geht das auch so schnell? Weil ich glaub nur das öffnen und schließen dauert wirklich lange, nicht das auslesen an sich... EDIT t hatte ich für tausend benutzt ![]() |
||
Marek |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wenn jede Datei(ich schätze mal für die einzelnen Levels?) "nur" 90KB groß ist, warum lädst du nicht die Levels immer dann, wenn du sie brauchst?
Ich meine, man braucht ja nicht gleich alle Levels, man kann ja so oder so nur auf einem gleichzeitig spielen^^ |
||
Wer lesen kann ist klar im Vorteil... |
onkelz89 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nein, jede Datei ist für ein Objekt und manchmal (sogar sehr oft ![]() -Kollisionen -Überprüfung - Status -vorhanden? usw. leider geht es anderes nicht |
||
Lumooja |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
onkelz89 hat Folgendes geschrieben: Problem ist nur ich hab kein Programm womit ich Dll erstellen kann bzw. man braucht doch ein Programm um in C zu programmieren oder? Hab vor langer Zeit mal damit experimentiert.
Also wenn du mit C nicht so gut vertraut bist, dann ist es wohl einfacher daß es jemand anderes schreibt. Ich kanns mal versuchen, aber nichts versprochen ![]() Zitat: Wie kommt es überhaupt das der Befehl dann soviel schneller ist. Und wie sieht es bei 10000 dateien aus die jeweils nur 90 kb klein sind geht das auch so schnell? Weil ich glaub nur das öffnen und schließen dauert wirklich lange, nicht das auslesen an sich...
Ich hab vor langem mit C rumgespielt, weil ich ein Programm haben wollte das eine Platte vollfüllt (wegen Datenschutz), und es sollte natürlich so schnell wie möglich sein. Soweit ich mich noch erinnern kann, kam ich nach zahlreichen Tests zum Ergebnis das gerade die blockgröße 16384 (das gilt für alle Dateigrößen, bei kleineren als 16384 langen Dateien liest man natürlich nur die Dateigröße ein) die schnellste ist, frag mich nicht warum das so ist bzw. war ![]() Was langsam ist, ist das finden einer Datei in einem Verzeichnis auf der Platte, und wenn viele Dateien im gleichen Verzeichnis sind, dauert das finden einer Datei ewig. Darum sollte man nie mehr als um so 128 Dateien in einem Verzeichnis haben, aber auch das ist schon zuviel. Das öffnen und schließen von Dateien dauert auch relativ lange. Darum solltest du nur eine Datei haben, die alle Levels enthält. Mit dem fseek() kann man dan in Mikrosekunden Schnelle auf die richtige Stelle innerhalb der großen Datei springen. Beim Speichern muß man dan die große Datei in 2 oder 3 Teile zerlegen (Anfang der Datei+Zu Speicherndes Level+Ende der Datei), aber das geht auch in Sekundenschnelle. |
||
onkelz89 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Erstmal danke für die Tipps mit den Dateien.. Ich dachte nicht das es erschwert wenn viele Dateien in einem Verzeichnis sind (bei direkter Pfadangabe) oder meintest du nur wenn man aus denn 500 Datein zB eine Datei raus filtert.
Gilt das selbe auch für Ordner? Das mit dem Programm mach dir die Mühe nur wenn du es auch gebrauchen könntest ich weiß noch nicht vielleicht reichen schon die bisherigen Tipps aus. Aber finds voll nett das du es anbietest ![]() Das mit der "nur eine Datei" ist sehr sehr schwer in meinem Fall aber ich werde versuchen zu reduzieren. Auf jeden Fall nochmal vielen Dank an alle !!! |
||
Lumooja |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Könntest du mal ein Beispiel zeigen, wie deine variablen in Blitz3D angelegt sind, also nur die die du speichern und laden willst.
Ich könnte mal ein bischen rumspielen und testen wie man die lade- und speicherzeit der variablen minimieren kann. Gut zu wissen wäre auch wieviele dieser Datensätze in der Praxis vorhanden sind, du sprachst von 10000? |
||
onkelz89 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
![]() ![]() Bisher bleibe ich fast nur bei der Theorie. Hab halt nur einen Editor für Häuser zu erstellen geschrieben. Davon könnte ich einen Ausschnitt zeigen (sind auch Types) Code: [AUSKLAPPEN] While Not Eof(filein)
teil$=ReadString( filein) zahl0=Instr(teil$,"#") zahl1=Instr(teil$,",") teilx = LSet(teil$,zahl1-1) teil$=RSet(teil$,zahl0-zahl1) zahl0=Instr(teil$,"#") zahl1=Instr(teil$,",") teily = LSet(teil$,zahl1-1) teil$=RSet(teil$,zahl0-zahl1) zahl0=Instr(teil$,"#") zahl1=Instr(teil$,",") teilz = LSet(teil$,zahl1-1) teil$=RSet(teil$,zahl0-zahl1) zahl0=Instr(teil$,"#") zahl1=Instr(teil$,",") teilinfo = LSet(teil$,zahl1-1) teil$=RSet(teil$,zahl0-zahl1) zahl0=Instr(teil$,"#") zahl1=Instr(teil$,",") teilgrad = LSet(teil$,zahl1+3) o.o = New o o\x = teilx o\y = teily o\z = teilz o\info= teilinfo If teilinfo=1 Then o\obj=CopyEntity(wand) If teilinfo=2 Then o\obj=CopyEntity(tur) If teilinfo=3 Then o\obj=CopyEntity(fenster) If teilinfo=4 Then o\obj=CopyEntity(tor) If teilinfo=0 Then o\obj=CopyEntity(boden) If teilinfo=5 Then o\obj=CopyEntity(zaun) If teilinfo=6 Then o\obj=CopyEntity(zauntor) PositionEntity o\obj,o\x,o\y,o\z EntityAlpha o\obj,1 EntityColor o\obj,255,255,255 o\grad = teilgrad TurnEntity o\obj,0,teilgrad,0 Wend Datei: Code: [AUSKLAPPEN] -8,0,4,1,0#
-8,0,0,1,0# -4,0,0,1,90# 0,0,0,1,90# 0,0,4,1,180# 0,0,8,1,180# -4,0,8,1,270# -8,0,8,1,270# Ist jetzt ein Beispiel... Aber so in etwa nehme ich die Infos aus Dateien... Es gibt bestimmt bessere Wege zum Ziel, aber genau darum warte ich ja noch bis ich wieder NUR Praxis mache ![]() |
||
ByteCroc |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wäre es nicht besser wenn du deine Leveldaten Binär speichern würdest ? | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group