Riesige Datenmengen im Prog unterbringen

Übersicht BlitzBasic Allgemein

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

 

Lumooja

BeitragDi, Jul 10, 2007 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
ByteCroc hat Folgendes geschrieben:
Wäre es nicht besser wenn du deine Leveldaten Binär speichern würdest ?

Ich dachte auch er würde es binär abspeichern Smile

Aber gut, das Beispiel ist ziemlich klar, denk ich... Im Grunde lädst du nur Koordinaten, Richtungen und Model-ID Nummern von 3D objekten, deren Entitymodel (=mesh+texture) alle schon einmal im Speicher sind.

Ich werde mal ein kleines speed-test-demo schreiben, um den Geschwindigkeitsunterschied zwischen deiner Text-Datei, einer Type-Binary Datei, und einer Raw-Binary Datei (+Memory move) zu testen.

PS. RSet ist aus irgendeinem komischen Grund saulangsam, wobei LSet ganz normal schnell ist, ist mir irgendwann nur mal so aufgefallen.
 

onkelz89

BeitragDi, Jul 10, 2007 20:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok vielen Dank schon im Vorraus.

Das mit RSet hm naja ok dann schau ich mal ob ich das auch nur mit LSet hinbekomme.

Und die Frage davor ... Ehm keine Ahnung Rolling Eyes ich habs irgendwann mal so gemacht und seit dem immer...
 

ByteCroc

BeitragDi, Jul 10, 2007 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Es geht do viel schneller die Daten in einer Schleife binär zu speichern und braucht auch weniger Platz

Nur ein Beispiel, ich weiß ja nicht wie deine Daten genau aussehen:
Code: [AUSKLAPPEN]
For i = 0 to 10000
    WriteInt MeinLevel, INTarray(i)
    WriteFloat MeinLevel, Floatarray#(i)
    WriteByte MeinLevel, INTarray(i)
Next
   


mit ReadInt , ReadFloat usw. kann man jeden in BB gebräuchlichen Typ direkt auslesen und mit WriteInt usw, speichern.
Aber warte mal was Lumooja noch rausbringt.
 

Lumooja

BeitragDi, Jul 10, 2007 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaub wir haben einen ganz anderen Flaschenhals hier. Mit 1,000,000 (1 million) Objekten wird Blitz3D ziemlich langsam, aber auch schon mit 30,000 Objekten ist die Bewegung ziemlich ruckhaft. Das lesen der Text-Datei dauert bei 1,000,000 Objekten (=Zeilen) 19s, und bei 30,000 Objekten nur 0.5s, ist das ein Problem?

Jetzt denk ich mir das du sowas wie ein Echtzeit einlesen der Datei willst, mal sehen wie der nächste Test ausgeht...
 

onkelz89

BeitragDi, Jul 10, 2007 22:58
Antworten mit Zitat
Benutzer-Profile anzeigen
WOW, das du es so schnell machst hät ich nicht geglaubt.
Nein, diese Werte wären vollkommen ok. Die Frage ist nur mit den mehreren Dateien. Ich kann nicht alles in eine schreiben. Es werden mindestens 10 sein (Gebäude) + 20-30 (Menschen) + 1oder 2 weitere (Vegetation) + 2 riesige (Objekte im Level) und (hab bestimmt was vergessen + 5 (Toleranz)

diese Werden nur bei Levelübergängen - neu geschrieben/überschrieben und die gleiche Zahl nur andere neu geladen...

Das Laden zwischen 2 Leveln darf ruhig 30-60 Sekunden dauern im Endeffekt macht das nicht sehr viel.

Allerdings ist noch eine Frage offen... Kannst du mir Eckdaten von deinem System nennen, weil dann kann ich zumindest ungefähr die Wert auf bzw abrunden.

Außerdem wird es InGame alle 5 Tage (1Tag = 24Min) ein Komplettupdate geben (alle Dateine aus allen Level agieren miteinander) Das darf auch ruhig 5- absolutes max. 10 Minuten dauern... nach 120Min. Spielen 10 Minuten Pause ist denke ich noch tragbar.

Auf jeden Fall kann ich dir garnicht genug danken Very Happy mach bitte weiter mit den Tests.


@Bytecroc
Vielen Dank ich habs ja nur mit Strings gemacht.. klar die werden relativ lahm sein und bisher (weiß nich wie das später mit Name usw aussieht) kann ich alles mit Zahlen regeln.
 

Lumooja

BeitragDi, Jul 10, 2007 23:16
Antworten mit Zitat
Benutzer-Profile anzeigen
onkelz89 hat Folgendes geschrieben:
WOW, das du es so schnell machst hät ich nicht geglaubt.

Ich hab sogar noch mit MilkShape3D deine Modelle gemacht Smile

Zitat:

Es werden mindestens 10 sein (Gebäude) + 20-30 (Menschen) + 1oder 2 weitere (Vegetation) + 2 riesige (Objekte im Level) und (hab bestimmt was vergessen + 5 (Toleranz)

Also haben wir dann um die 50 Dateien per Level? Ich sehe keinen Grund warum alle Daten nicht in eine Datei geschrieben werden könnten, du kannst doch eine Stop-Marke einbauen wo die Gebäude aufhören, und die Menschen anfangen, usw..., da du doch sowiese alle auf einmal einlädst.
Aber wenns unbedingt sein muß, kansst du auch deine 50 Dateien per Level haben, aber dann solltest du unbedingt ein Verzeichnis für jeden Level machen (50 Dateien per Verzeichnis).

Zitat:
Das Laden zwischen 2 Leveln darf ruhig 30-60 Sekunden dauern im Endeffekt macht das nicht sehr viel.

Das wird wohl kaum länger als 10 Sekunden dauern, ausser du fängst an auch Bilder und Musik einzuladen.

Zitat:

Allerdings ist noch eine Frage offen... Kannst du mir Eckdaten von deinem System nennen, weil dann kann ich zumindest ungefähr die Wert auf bzw abrunden.

Ich hab mir neulich extra einen langsamen PC gekauft, damit ich effizienter programmieren muß. Manche leute machen Spiele mit Super-Rechnern und dann sind die zu langsam auf normalen Rechnern Smile
Ich hab Asrock 4coredual MB (40€) + Intel Core 2 Duo 1.6GHz (das langsamste was es gab) + mein alter AGP 8x Asus AX800XTPE (schon 3 Jahre alt und immer noch schnell genug) + 2GB RAM (50€, RAM is grad super billig).
 

onkelz89

BeitragDi, Jul 10, 2007 23:52
Antworten mit Zitat
Benutzer-Profile anzeigen
^^ ok ne lahme Kiste ist es ja nu auch nicht wirklich. Vor allem die 2 GB Ram. OK aber der Heutige Stand sieht anders aus.
Zu meinem jetzigen System (wird mich auch noch ein paar Monate begleiten)

Altes Sockel A Board, Athlon 3000+, 1GB Ram, 5200 GF FX

ist denke ich "etwas" langsamer Wink

Aber das geht schon irgendwie...

Die Daten möchte ich nur aus einem Grund in verschiedene Dateien haben und zwar weil ich manchmal nur bestimmte Datein speicher, manche öfter manche seltener. Es wäre letzten endes (denke ich) aufwendiger wenn man immer die komplette Datei speichert und läd (normalerweise NUR bei Levelüberschreitungen), aber ich muss wie gesagt die Möglichkeit offen halten.

Deine Angabe oben 30.000 Objekte (30.000 Zeilen)
meinst du damit 30.000 einzelne Werte die ich eintrage oder wirklich 1024 bytes oder wie das noch gleich war (glaub eine komplette Zeile ist genau so lang - ohne Zeilenumbruch im Editor versteht sich)
 

Lumooja

BeitragMi, Jul 11, 2007 0:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Die 30,000 Objekte waren 30,000 Text-Zeilen, von denen jede Zeile so war wie in deinem Beispiel, z.B. Zeile 1:
-8,0,4,1,0#
 

onkelz89

BeitragDo, Jul 12, 2007 9:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, cool das würde dann passen. Manchmal sind die Zeile zwar länger, aber das geht schon
 

Lumooja

BeitragDo, Jul 12, 2007 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt hab ich auch Test 2 ausgeführt, also wo die Daten mit "teilx=ReadInt(filein)" eingelesen werden. Die Ergebnisse waren wie folgt:
Einlesen von 1000000 (1 million) Objektdaten (="Zeilen"): 6.5 Sekunden.
Einlesen von 30000 Objektdaten: 0.19 Sekunden.
Das heißt, damit kannst du 153486 Objekte per Sekunde einlesen.

Das müsste doch schon reichen, und es macht keinen Sinn das noch schneller zu machen, da der Flaschenhals sowieso beim Anzeigen der 1 million 3D Objekte steckt.
 

Dreamora

BeitragDo, Jul 12, 2007 20:45
Antworten mit Zitat
Benutzer-Profile anzeigen
du vergisst was: während dem einlesen bleibt das gesamte programm stehen.
Im Hintergrund laden geht nur mit sinnvoller Segmentierung (wenn man das ganze zb mit 1000er Blöcken macht kann man das durchaus im Hintergrund machen und hat dennoch 60+ FPS Smile )
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Lumooja

BeitragDo, Jul 12, 2007 20:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das stimmt und ist ne gute Idee. Wie würdest du so ein multi-threading implementieren? Ich hab's immer so gemacht das ich andauernt eine Variable hochzähle, and dann mit "if (x mod 1000)=0 then" einen einen Slice (=Funktionsaufruf) eines Hintergrundtaskes triggere. Das Problem dabei ist, das wenn ich mehrere "threads" habe, das die sich irgendwann überschneiden, z.B: x mod 1000 und x mod 250 alle 4 Runden. Gibst da nicht irgendeinen logischen Trick um die Threads untereinander noch irgendwie zu phasieren?
 

Dreamora

BeitragDo, Jul 12, 2007 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Jopp, priority queue wo sich die Tasks eintragen müssen und sie werden dann nacheinander ausgeführt.
Dann am besten per Round Robin Taskswitch verfahren arbeiten, damit sollten sich die besten Resultate erzielen lassen Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Lumooja

BeitragDo, Jul 12, 2007 21:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Affengeile Idee! Das muß ich doch gleich ausprobieren...
 

Matthias

Betreff: MOD zu langsam

BeitragFr, Jul 13, 2007 16:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay. Da ich gerade gelesen habe das du mit MOD arbeitest und dein Prg. schnell sein soll will ich dir darauf hinweisen das MOD recht langsam ist deshab hier ein andere möglichkeit. Die ca 20% schneller ist.

Code: [AUSKLAPPEN]

Graphics 800,600,32,2
SetBuffer BackBuffer()
Zeit=MilliSecs()

Repeat
Zaler=Zaler+1
Z=Zaler Mod 1024

;Z=Zaler-(Zaler Shr 10) Shl 10
If Z=0 Then ZalerB=ZalerB+1

If ZalerB>10000 Then
AppTitle MilliSecs()-Zeit+"ms":WaitKey()
End If


Until KeyDown(1)=1
End

Viel Erfog bei deinem Projeckt
Gruß Matthias.
 

coldie

BeitragFr, Jul 13, 2007 23:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja und ich würd versuchen es mit readbytes() in eine Bank zu laden. Das geht x fach schneller als jeden Wert einzeln zu laden.
 

onkelz89

BeitragSa, Jul 14, 2007 9:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Ideen die hier schon gefallen sind, klingen echt gut. Werde auf jeden Fall einiges ausprobieren (bin momentan nur auf der Arbeit).

In Realtime müsste ich es eigentlich nicht machen, außer manchmal kleinere Dinge, aber das geht dafür ist´s schnell genug.

Die Sache war wie auch am Ende der letzte Beitrag (in Banks laden), dass ich große Datenmengen "bereithalte".
Die ursprünglich 10.000 - 30.000 Types sind ja eh da pro Level, aber die anderen Level in Banks speichern... wär doch eigentlich ne gute Sache.

Kann man denn dort soviele nehmen ohne das eigentliche Spiel sehr zu verlahmen? Ich spreche von bis zu 1 Million und mehr Banks.

Ich kenne mich nicht gut mit Banks aus daher frage ich.

Und nochmal vielen vielen Dank für die bisherige Hilfe
 

Matthias

BeitragSa, Jul 14, 2007 10:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay. Ich weiß jetzt nicht genau wie sehr es dir um Speed geht aber eins steht fest. Wenn du 100000 oder mehr Objekte verwalten wilst dann sind Types nicht dafür geeignet das Steht auch irgendwo das mann types nicht für so große daten mengen nutzen sollte. Sie werden einfach immer langsammer um so mehr es werden. Da würde ich dir dann raten doch auf
Dims umzusteigen.

Types: sehr langsam.(Variabel) Banks: Einen Tick langsamer als Dims(aber auch Variable >ResizeBank)

Dims (Statich unkonfontabel aber extrem schnell)
ZB Dim(Objekt,Eigenschaft) (Dim Objeckte(1000000,10)

Bei 5000 Objekten spielt es alles keine Rolle aber bei eine Mill. Schon.

Und voralem vermeide Floats die sind .... langsam. Und noch viel langsamer in Types.
Du kannst zb bei berechnungen die zahlen voher erweitern.

und wenn du sie brauchst wieder Teilen





Code: [AUSKLAPPEN]
Graphics 800,600,32,2


Image=CreateImage(20,20):SetBuffer ImageBuffer(Image)
Color 200,0,0:Oval 0,0,20,20

SetBuffer BackBuffer()
Repeat:
MI=MilliSecs()



Select MI>SpielTimer+10:Case 1
SpielTimer=MI


Cls:DrawImage Image,X Shr 12,Y Shr 12
X=X+1000:Y=Y+1000
Flip
End Select
Until KeyDown(1)=1
End

Auserdem ist es Quatch das Spiel dauernt zu Updaten es reicht wenn du es alle 10ms tust.

Gruß Matthias
 

onkelz89

BeitragSa, Jul 14, 2007 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hatte nie vor 100.000 und mehr Types zu benutzen... darum habe ich diesen Thread eröffnet Wink

Dim klingt sehr gut. Habe ich auch schonmal was mit gemacht ist echt praktisch UND multidimensional man kann zB. dann sowas machen:

Dim (Objekt,Gruppe,Eigenschaft,Wert) usw. aber 2 oder 3 Dimensionen werden ja reichen.

Und sorry für folgende Frage (ist eigentlich TOTALER Anfängerbereich...)
Floats.. was war das genau?
Strings ist ja Text...
Floats? Zahlen mit Kommastellen oder?
Wenn ja - kein Problem. Ich könnte die alle rausnehmen.


Achja und geupdatet wird es eh nur alle Paar Minuten (Außer Kollisonschecks usw.) oder bei Levelübergängen...

BladeRunner

Moderator

BeitragSo, Jul 15, 2007 22:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich frage mich immer wieder wo das Gerücht herkommt Floats seien langsam. Der Prozessor ist für diese Rechnerei gebaut - das ist keine Speedbremse.
Um genau zu sein gab es sogar Rechner bei denen die Nutzung von INT definitiv langsamer als die von Floats war, da jede INT intern in eine Float umgewandelt wurde.
Ob dies auf moderne Architektur zutrifft weiss ich nicht. Aber ich glaube nicht dass die Verwendung von floats ein Programm spürbar bremst.
EDIT: kurzer Test kam zu folgendem Ergebnis: In der Erstellung sind floats und ints gleichschnell. Bei der ERSTMALIGEN Benutzung der erstellten Arrays liegen die Ints ohne Debug um bis zu ein Drittel vorne. Danach jedoch bleibt der Unterschied gering, die Ints sind maximal ein - zwei Msecs für 10 Millionen Objekte schneller.
Ich denke der Unterschied bei der Erstverwendung liegt daran dass das Array mit nullen befüllt ist und und erst ein Typecast durchgeführt wird.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group