Dim-Felder statt Types (Diskussion)

Übersicht BlitzBasic Allgemein

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen

 

getlose

BeitragMo, Sep 27, 2004 23:02
Antworten mit Zitat
Benutzer-Profile anzeigen
@hubsi, damit könntest du recht haben, ich hab das auch
mal irgendwo gelesen...nur wo... Rolling Eyes

Jolinah

BeitragDi, Sep 28, 2004 1:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann schon sein, ich weiss nicht wie es bei BB genau geregelt wird, jedenfalls ist es bei richtiger oop so und deswegen hab ich angenommen das es bei bb auch so ist.

Irgend in nem anderen Post hab ich das auch schon geschrieben:

BB ist mir persönlich eh noch zu wenig OOP. Viele Projekte hab ich schon liegen lassen nur weil es mich angekackt hat irgend eine umständliche andere Lösung zu benutzen, wo man mit OOP ganz leicht hätte lösen können. Deshalb freu ich mich schonmal auf BlitzMax Wink

Kabelbinder

Sieger des WM-Contest 2006

BeitragDi, Sep 28, 2004 13:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Nagut:
Erstmal danke für das Lob, Holzchopf. Aber das mit der Tabelle ist finde ich nicht so gravierend, schließlich muss man das Dim-Feld ja nicht bei 0 beginnen. Ich habe es in diesem Fall so dargestellt, dass es halt bei eins anfängt.

Außerdem: manche Sachen, die hier niedergeschrieben wurden kann man einfach nicht stehenlassen:
z.B. Zitat:
müssen bei DIM alle möglichen Gegner(egal ob lebend, abgenibbelt oder noch gar nicht erstellt) geprüft werden


Wieder so einer, der das Tutorial offensichtlich nicht gelesen hat:

Ich habe mehrmals auf den Eintrag "leben" hingewiesen es ist bei dims zwar der Fall, dass jeder eintrag "leben" erstmal gecheckt werden muss, aber man macht für den gegner keine Bewegungsberechnung oder Kollisionsabfrage, wenn er nicht lebt. Die macht man nur dan, wenn der eintrag leben = 1 ist.

Und bei der Zeit, die bei der Lebensabfrage draufgeht, handelt es sich echt um Peanuts. Hab mal ein kleines Testprogramm geschrieben:

Code: [AUSKLAPPEN]
Graphics 640,480,16,2
SeedRnd MilliSecs()
Dim array(100000)

punkt = MilliSecs()
For i = 0 To 100000
If array(i)=3 Then a = 0
Next

zeit = MilliSecs()-punkt
Write "hat " +Str$(zeit)+ " Millisekunden gedauert"

WaitKey
End


Bei mir 16 Millisekunden für 100000 Gegner.

Also ist die Frage, was schneller ist gar nicht so leicht zubeantworten.
<Wing Avenger Download> ◊◊◊ <Macrophage Download>
  • Zuletzt bearbeitet von Kabelbinder am Mi, Sep 29, 2004 17:58, insgesamt einmal bearbeitet

Gina

BeitragDi, Sep 28, 2004 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich finde auch, dass man nicht pauschal sagen kann, ob nun Dim-Felder oder Type-Felder besser sind. Es kommt eben immer auf die Situation bzw. auf den konzipierten Spielablauf an.

Bei Bubbles habe ich es z.B. so gemacht:

Ich habe ein Dim-Feld für meine 300 Kugeln, in denen ich die x- und y-Koordinaten speicher und die Farbe. Wobei Farbe = 0 bedeutet, dass die Kugel schon weg ist.
Dazu habe ich ein Type-Feld, wo ich die Anzahl der verbleibenden Möglichkeiten speicher. Jede Möglichkeit hat eine Nummer und zu jeder Möglichkeit werden die betreffenden Kugeln in der Type-Tabelle aufgenommen.
Wenn nun eine Kugel angeklickt wurde, ratter ich durch das Type-Feld, suche die Nummer raus und setze bei allen Kugeln, die diese Nummer haben, im Dim-Feld die Farbe auf 0. Ich spreche also die Dim-Felder gezielt an und muss nicht alle 300 Kugeln durchprüfen.

Die Type-Tabelle wird dann gelöscht und beim nächsten Durchlauf neu aufgebaut. Man sieht auch deutlich, dass die Frames steigen, je weniger Kugeln auf dem Bildschirm sind.

Die Kombination von Dim- und Type-Feld, war für meinen Zweck die schnellste Methode.

Jeder sollte einfach beide Arten lernen und verstehen und damit experimentieren, um die beste für sich rauszufinden.
Und wie gesagt, je nach Situation kann mal dieses und mal jenes Ergebnis bei rauskommen...

Gina.
www.jk-spiele.de

Suco-X

Betreff: ......

BeitragDi, Sep 28, 2004 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast ihn falsch verstanden.
Du musst doch jedesmal deine 100000 Gegner durchgehen und fragen ob sie leben oder nicht.
Das meint er damit. Bei Types hat man so viele Gegner wie gebraucht werden und muss nicht mit einem Maximalen Wert arbeiten.
Du gehst also mit jeder Schleife 100000 Einträge durch mit der Dim Version, egal ob nur 10 oder 100 Gegner überhaupt leben. Und mit Types müsstet du halt nur die 10 oder 100 Einträge durchgehen und kannst dir desweiteren die Leben Abfrage auch sparen.
Also ist die Frage ob die 100000 Abfragen schneller sind als die 20 Abfragen bei der Type Version.
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Gina

BeitragDi, Sep 28, 2004 14:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, ich habe ihn schon richtig verstanden, keine Sorge... Wink

Trotzdem gibt es auch bei Monstern Situationen, wo ich auch Dim-Felder nehmen würde:

Nehmen wir mal an, ich habe einen bestimmten Spot, wo ständig 25 Monster rumhängen. Die werden gekillt und spawnen nach einer gewissen Zeit wieder. Warum sollte ich in diesem Fall ständig Type-Felder anlegen und löschen...?

Wie gesagt, es gibt für jede Situation einen passenden Feld-Typ und jeder sollte es im Zweifelsfall einfach probieren, welcher dann am geeignetsten ist.

Gina.

Edit. Selbst bei 300 schon, war das Dim-Feld bedeutend schneller, als ein Type-Feld...
www.jk-spiele.de

Jolinah

BeitragDi, Sep 28, 2004 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Gina, Suco hat wahrscheinlich auch nicht dich gemeint sondern Kabelbinder Wink


Und mit deiner Aussage triffst du voll ins Schwarze. Es gibt Situationen wo Arrays eindeutig bevorzugt werden können. Ich habe nichts gegen Arrays, man sollte beide gemischt gebrauchen, aber immer klug verwenden. Es ging mir auch hauptsächlich drum die Sache mit dem Speicher zu erklären. Und wie gesagt bieten andere Sprachen noch viel mehr so Elemente wie Types. Types sind von daher sogar schon etwas primitiv. In diesen Sprachen sieht man es eigentlich nie das ein Array für sowas missbraucht wird. Aber spielt ja jetzt keine Rolle, wir sind hier bei BB Wink

sbrog

BeitragDi, Sep 28, 2004 15:21
Antworten mit Zitat
Benutzer-Profile anzeigen
man könnte doch das ganze so verwalten ,dass alle lebdigen Gegner im vorderen Teil des Dimfelds gespeichert werden und alle toten im hinteren. Wäre mittels sortierverfahren ganz einfach.

Dann könnte man sich eine Funktion Create(parameter) schreiben, die jedesmal die anzahl um 1 erhöht, wenn ein gegner erstellt wird.

Wenn man die Anzahl der lebenden Gegner weiß, kann man genau soviele durchgehen. Da alle lebenden im vorderen bereich des felds gespeichert sind, werden nur die lebenden durchgegangen.

Gina

BeitragDi, Sep 28, 2004 15:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Aso... *oops* Embarassed

@ sbrog

Das ist natürlich auch keine schlechte Idee und bestimmt in manchen Situationen ideal...

Gina.
www.jk-spiele.de
 

hot-bit

Gast

BeitragDi, Sep 28, 2004 18:24
Antworten mit Zitat
Hoi,

es geht hier eigentlich nicht darum, was schneller oder langsamer ist.
Denn bei der Geschwindigkeit unserer heutigen Prozessoren, macht das ja einen Klacks aus.

Ich bin mit DIM's aufgewachsen, und habe die über 20 Jahre verwendet. Also habe da einige Erfahrung damit. Das könnt ihr mir glauben.

Als ich aber hier bei BB die Type's entdeckte, war ich froh, daß ich etliche Sachen nun viel einfacher lösen konnte.

Ich möchte Types einfach nicht mehr missen ...

Es hat DIM seine Berechtugung und Types auch.

DIM verwende ich, wenn ich 1 oder 2 feldrige Arrays benutze, ansonsten nur mehr Types.

Und falls wer bei DIM stehenbleibt, der kapiert die TYPE's einfach nicht. Das ist aber dann sein Problem !
Und der soll dann auch keinen Schwachsinn über Types schreiben. Pasta.

Toni

D2006

Administrator

BeitragDi, Sep 28, 2004 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
hier meine two cents:

Ich benutz lieber DIMs. Mir ist egal was andere benutzen.
Ich finde die Diskussion zeitverschwendung.
In der Zeit, wo hier ohne Ergebnis gepostet wird, kann man
schöne DIM oder TYPE routinen für Spiele coden.

Macht das! Ist produktiver.

MfG
 

BIG BUG

BeitragDi, Sep 28, 2004 22:16
Antworten mit Zitat
Benutzer-Profile anzeigen
@Kabelbinder: OK, das mit dem "schneller" sind wirklich Peanuts(hätte gedacht das dauert länger), aber DIMs sind eben nicht generell schneller.

@sbrog: Ist umständlich zu verwalten und kostet auch seine Rechenzeit.
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

Kabelbinder

Sieger des WM-Contest 2006

BeitragMi, Sep 29, 2004 18:12
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Suco

Wer nimmt denn auch 100000 als Maximalwert? Ich nehme eher so 200, oder so.
Ich habe hier nur 100000 im Beispiel genommen, damit die benötigte Zeit überhaupt lang genug ist, um sie messen zu können. Bei 200 würde der ja weniger als 1 Millisekunde brauchen, sodass du die Zeit noch nicht mal messen kannst.
Außderdem kann man den MaximalWert ja so anlegen, dass er in normalen Maßen liegt. für Pacman z.b würde ich noch nicht mal 200 als Maximalwert nehmen, vielleicht so 15 oder 20.
Es ist wohl wahr, das überflüssigerweise ein paar leere Einträge mitgeprüft werden, aber die dafür benötigte Zeit ist verdammt wenig.
Und es ist nunmal so, dass Types einfach langsamer sind, als Dim-Felder, und ich behaupte einfach mal, der gebrauch von Types wiegt die Zeit, die gebraucht wird um die leeren Einträge des Dim-Felds zu prüfen, auf.
<Wing Avenger Download> ◊◊◊ <Macrophage Download>
 

hot-bit

Gast

BeitragMi, Sep 29, 2004 18:18
Antworten mit Zitat
Hm...

wenn du schon was behauptest, dann beweise es !

Also, setz dich hin, und gib mir ein Beispiel, daß Types soo viel langsamer sind.
Dann können wir weiter diskutieren !

Types sind eine Spur langsamer als Arrays. Aber ob sich das bei 200 Aufrufen oder so, zu Buche schlägt, sei dahin gestellt.

Ansonsten: nicht aufgeschnapptes nachplappern, sondern testen !

Bin gespannt auf deinen Bericht !

Toni

Kabelbinder

Sieger des WM-Contest 2006

BeitragDo, Sep 30, 2004 20:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Man, wie konnte ich mich nur dazu breitschlagen lassen, echt ein Testprogramm zu schrieben. Verdammt, so ne Zeitverschwendung, sich über sowas den Kopf zu zerbrechen, ich könnte mich echt aufregen. Wenn jemand ankommt und irgendwas militant anzweifelt, soll erst gefälligst selbst beweisen.
Hot-Bit, wenn dich das so interessiert, was schneller ist, kannst du das dann nicht auch selber rausfinden, oder muss Kabelbinder die ganze Drecksarbeit erledigen?

Übrigens, das mit dem schneller hab ich aus Rene's Buch. Und dann kann ich's doch auch glauben, oder?

So, hier die Test Programme. Beide erstellen 20000 objekte mit x,y,xricht,yricht,red,green und blue, einer mit Type, einer mit dim. bei mir bei Type 83 im Durchschnitt, bei Dim 81 im durchschnitt.

dim:
Code: [AUSKLAPPEN]
Graphics 640,480,16,1
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Dim gegner(20000,8)
For i = 0 To 20000
gegner(i,1)=Rand(100,540)
gegner(i,2)=Rand(100,380)
gegner(i,3)=1
gegner(i,4)=Rand(-2,2)
If gegner(i,4)=0 Then gegner(i,4)=1
gegner(i,5)=Rand(-2,2)
If gegner(i,5)=0 Then gegner(i,5)=1
gegner(i,6)=Rand(0,255)
gegner(i,7)=Rand(0,255)
gegner(i,8)=Rand(0,255)
Next

Repeat

punkt = MilliSecs()
For i = 0 To 20000
If gegner(i,3)=1 Then
Color gegner(i,6),gegner(i,7),gegner(i,8)
gegner(i,1) = gegner(i,1) + gegner(i,4)
gegner(i,2) = gegner(i,2) + gegner(i,5)
If gegner(i,1)>640 Then gegner(i,1)=0
If gegner(i,1)<0 Then gegner(i,1)=640
If gegner(i,2)>480 Then gegner(i,2)=0
If gegner(i,2)<0 Then gegner(i,2)=480
Rect gegner(i,1),gegner(i,2),5,5
EndIf
Next

zeit = MilliSecs()-punkt
punkt = MilliSecs()

c = c + 1
viel = viel + zeit

Color 0,0,0
Rect 0,0,100,20
Color 255,255,255
Text 0,0,zeit,0,0

Flip 0
Cls
Until KeyHit(1)
FlushKeys()

Cls
Text 320,240,Str$(viel/c) + " im Durchschnitt.",1,1
Flip
WaitKey

End


type
Code: [AUSKLAPPEN]
Graphics 640,480,16,1
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Type gegner
Field x,y,xricht,yricht,red,green,blue
End Type

For i = 0 To 20000
quat.gegner = New gegner
quat\x = Rand(100,540)
quat\y = Rand(100,380)
quat\xricht = Rand(-2,2)
If quat\xricht = 0 Then quat\xricht = 1
quat\yricht = Rand(-2,2)
If quat\yricht = 0 Then quat\yricht = 1
quat\red = Rand(0,255)
quat\green = Rand(0,255)
quat\blue = Rand(0,255)
Next

Repeat

punkt = MilliSecs()
For quat.gegner = Each gegner
Color quat\red,quat\green,quat\blue
quat\x = quat\x + quat\xricht
quat\y = quat\y + quat\yricht
If quat\x>640 Then quat\x=0
If quat\x<0 Then quat\x=640
If quat\y>480 Then quat\y=0
If quat\y<0 Then quat\y=480
Rect quat\x,quat\y,5,5
Next

zeit = MilliSecs()-punkt
punkt = MilliSecs()

c = c + 1
viel = viel + zeit

Color 0,0,0
Rect 0,0,100,20
Color 255,255,255
Text 0,0,zeit,0,0

Flip 0
Cls
Until KeyHit(1)
FlushKeys()

Cls
Text 320,240,Str$(viel/c) + " im Durchschnitt.",1,1
Flip
WaitKey

End


und D2006, ich muss mich dir echt anschließen!
<Wing Avenger Download> ◊◊◊ <Macrophage Download>
 

hot-bit

Gast

BeitragDo, Sep 30, 2004 21:23
Antworten mit Zitat
Hi,

bißchen wirr im Kopf ?

Hatte ich nicht geschrieben, daß Types eine Spur langsamer sind ?
Ich wußte es ja. Wollte nur dich überzeugen, daß der Zeit-unterschied nicht so gravierend ist, wie Rene das immer behauptet !

Und deswegen sagte ich, zeig mir eine Demo.

Types sind viel leichter zu handhaben !

Oder was ist da leichter zu verstehen :

wert(1,1)=20
wert(1,2)=30
wert(1,3)=4
wert(1,4)=-2
wert(1,5)=1
wert(1,6)=6
.....

oder:

wert\x=20
wert\y=30
wert\x_vel=4
wert\y_vel=-2
wert\richtung=1
wert\status=6
.....

Also für mich sind Types viieelll einfacher.
Denn bei den Arrays müßte ich immer wieder nachgucken, was was für was ist !

Toni
 

junky

BeitragDo, Sep 30, 2004 23:30
Antworten mit Zitat
Benutzer-Profile anzeigen
sagt mal ... Types ( Structures ) ansich haben doch erstmal garnix mit Arrays zu tun !?

ich kann Types genauso mit Arrays verbinden, wie mit LinkedLists ( was hier wohl viele als schlicht weg die einzige Art mit Types zu arbeiten ansehen )

ich persönlich arbeite z.B. sehr gerne mit der Type/Array-Kombi, da ich hierbei einfach den Überblick und die Möglichkeiten der Types habe (z.B. nochma en BlitzArray einfügen, ohne in ne 2. oder 3. ArrayDimension zu müssen ) und gleichzeitig ne Grundstruktur der Arrays, in denen ich auch mal direkt auf ein Element zugreifen kann ohne mich erst wie ein "Affe" entlang hangeln zu müssen... ( blöde Eigenschaft der Types in BB... )
gestern stand ich noch vorm Abgrund
heute bin ich einen Schritt weiter...

Firstdeathmaker

BeitragFr, Okt 01, 2004 10:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe am Anfang bei meinem ersten Spiel auch nur DIM´s benutzt. Bei den Gegnern klappt das auch ganz gut (Spaceshooter), man kann ja pro level sagen wieviele Gegner auftauchen sollen und danach halt das Feld dimensionieren. Die Schüssen hatte ich ebenso gemacht, allerdings habe ich das nachher in müheseeliger Handarbeit wieder geändert, weil es mit Types einfach flexibler war. Heute schaue ich einfach was gerade besser passt (Für eine Map ist doch ein DIM Feld geradezu geschaffen, oder?).

@ Alle die Types noch nicht so richtig verstanden haben und lieber DIM´s benutzen: Ich empfehle euch das nochmal zu versuchen, es ist wirklich besser wenn man flexibel in solchen Sachen ist, als sich stur und starr nur an das zu klammern was man besser kann.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

Timo

BeitragFr, Okt 01, 2004 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt viele Sachen, die mit Dims leichter zu lösen sind, es gibt aber auch genauso viele Sachen, die mit Types zu lösen sind. Darum könnte ich nicht sagen ich mag Dims oder Types lieber. Vielmehr finde ich es gut, das man die Auswahl hat!! Ohne Types zu programmieren fänd ich genauso blöd wie ohne Dims Wink

TheShadow

Moderator

BeitragFr, Okt 01, 2004 17:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Du gehst also mit jeder Schleife 100000 Einträge durch mit der Dim Version, egal ob nur 10 oder 100 Gegner überhaupt leben. Und mit Types müsstet du halt nur die 10 oder 100 Einträge durchgehen


wenn du 100 DIM-einträge hast und du willst, Nr. 70 löschen - dann entsteht eine Lücke. Um diese zu schliessen, kann man entw alle 71-100 elemente nach vorne rücken (langsam) oder man verschiebt #100 nach #70 und setzt max-variable auf 99 (die man sowieso haben sollte)
Hat den Nachteil, dass die Einträge ständig umsortiert werden...
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group