Riesige Datenmengen im Prog unterbringen
Übersicht

Lumooja |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
ByteCroc |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() @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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
^^ 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ah, cool das würde dann passen. Manchmal sind die Zeile zwar länger, aber das geht schon | ||
Lumooja |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Lumooja |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Lumooja |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Affengeile Idee! Das muß ich doch gleich ausprobieren... | ||
MatthiasBetreff: MOD zu langsam |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich hatte nie vor 100.000 und mehr Types zu benutzen... darum habe ich diesen Thread eröffnet ![]() 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... |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group