Doppelt Verkettete Liste mit Banks

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Gombolo

Betreff: Doppelt Verkettete Liste mit Banks

BeitragDi, Jan 03, 2006 13:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Vor ein paar Tagen wollte ich es wissen.

Sind Banks schneller als Types? 8)

Dazu wurde eine doppelt verkettete Liste mit Banks programmiert. So das man neue Objekte einfügen kann, welche Löschen etc... Also alles was man auch mit Types machen kann sollte auch mit den Objekten in der Liste funktionieren.

Das Ergebniss bei mir war etwas entäuschen. Ich hatte angenommen das Banks etwas schneller sind. Nun beide sind, bei mir auf dem Rechner, gleich schnell.

Hier der Code und zwei Beispielprogramme. Eine verwendet die List und das andere BB Types.

Code: [AUSKLAPPEN]

;####################################################
;           Object Manager (Test Version)
;
; Author  :  Gombolo / 3DKult
; E-Mail  : 
; Web Site:
;
;####################################################
;
; Beschreibung:
;
;   Speicher   Name            Beschreibung
; |----------|---------------------------------------
; |     0    | SIZE_      |  Anzahl der Elemente
; |----------|------------|--------------------------
; |     4    | NEXT_      |  Nächstes Element
; |----------|------------|--------------------------
; |     8    | PREV_      |  Vorgänger Element
; |----------|------------|--------------------------
; |    12    | DATA_      |  Daten
; |----------|------------|--------------------------
;
;####################################################

;####################################################
; Konstante
;####################################################
Const   SIZE_   = 0
Const   NEXT_   = 4
Const    PREV_   = 8
Const    DATA_   = 12

;####################################################
; Type
;####################################################

;####################################################
; Functionen
;####################################################

;####################################################
; NAME       : gxCreateList()
; PARAMETER  : keine
; BESCHREIBUG: Erstellt erstes Element
;              einer neuen List
;####################################################
Function gxCreateList()
   Local bank_%

   bank_ = CreateBank(16)
   
   PokeInt bank_, SIZE_, 0
    PokeInt bank_, NEXT_, 0
    PokeInt bank_, PREV_, 0
    PokeInt bank_, DATA_, 0

   Return bank_
End Function

;####################################################
; NAME       : gxFreeBank(bank)
; PARAMETER  : bank = Zeiger auf eine Speicherbank
; BESCHREIBUG: Gibt Speicher wieder frei
;####################################################
Function gxFreeBank(bank_%)
   FreeBank(bank_)
   Return 0
End Function

;####################################################
; NAME       : gxDeleteList(bank)
; PARAMETER  : bank = Zeiger auf Listenanfang
; BESCHREIBUG: Löscht alle Elemente einer Liste
;####################################################
Function gxDeleteList(bank_%)
   Local temp_%

   While(bank_<>0)

      temp_ = bank_
      bank_ = PeekInt(bank_,NEXT_)

      gxFreeBank(temp_)

   Wend

   Return 0

End Function

;####################################################
; NAME       : gxDeleteBank(bank)
; PARAMETER  : list = Adresse der Liste
;              bank = Element das gelöscht wird
; BESCHREIBUG: Löscht ein Elemente aus der Liste
;####################################################
Function gxDeleteBank(list_%,bank_%)

   If(bank_=0) Return list_

   Local tempPrev_%, tempNext_%

   PokeInt(list_,SIZE_,PeekInt(list_,SIZE_)-1)
   
   tempNext_ = PeekInt(bank_,NEXT_)
   tempPrev_ = PeekInt(bank_,PREV_)

   If(tempNext_<>0)
      PokeInt(tempNext_,PREV_,tempPrev_)
   EndIf

   If(tempPrev_=0)
      PokeInt(tempNext_,SIZE_,PeekInt(list_,SIZE_))
      list_ = tempNext_
   Else
      PokeInt(tempPrev_,NEXT_,tempNext_)
   End If
   
   gxFreeBank(bank_)

   Return list_

End Function

;####################################################
; NAME       : gxLoadMesh(list, filename)
; PARAMETER  : list     = Listenanfang
;              filename = Datei welches geladen wird
; BESCHREIBUG: Ladet ein Mesh und füngt ein neues
;              Element in die Liste ein. Gibt
;            erstelltes Element zurück
;####################################################
Function gxLoadMesh(list_%, filename_$)
   Local temp_%, bank_%, ret_%

   If(list_=0) Return 0

   If(PeekInt(list_,SIZE_)=0)
      PokeInt(list_,SIZE_,PeekInt(list_,SIZE_)+1)
      PokeInt(list_,NEXT_,0)
      PokeInt(list_,PREV_,0)
      PokeInt(list_,DATA_,LoadMesh(filename_))

      Return list_
   Else
      PokeInt(list_,SIZE_,PeekInt(list_,SIZE_)+1)

      While(PeekInt(list_,NEXT_)<>0)
         list_=PeekInt(list_,NEXT_)
      Wend

      bank_ = gxCreateList()

      PokeInt(bank_,SIZE_,0)
      PokeInt(bank_,NEXT_,0)
      PokeInt(bank_,PREV_,list_)
      PokeInt(bank_,DATA_,LoadMesh(filename_))

      PokeInt(list_,NEXT_,bank_)

      Return bank_
   EndIf

   Return 0
   
End Function

;####################################################
; NAME       : gxNext(list)
; PARAMETER  : list     = Listenanfang
; BESCHREIBUG: Gib das Element nach list zurück
;####################################################
Function gxNext(list_%)
   If(list_<>0)
      Return PeekInt(list_,NEXT_)
   Else
      Return 0
   EndIf
End Function

;####################################################
; NAME       : gxSize(list)
; PARAMETER  : list     = Listenanfang
; BESCHREIBUG: Gibt Anzahl aller Elemente zurück
;####################################################
Function gxSize(list_%)
   If(list_<>0)
      Return PeekInt(list_,SIZE_)
   Else
      Return 0
   EndIf
End Function

;####################################################
; NAME       : gxMesh(list)
; PARAMETER  : list     = Listenanfang
; BESCHREIBUG: Gibt Mesh zurück
;####################################################
Function gxMesh(list_%)
   If(list_<>0)
      Return PeekInt(list_,DATA_)
   Else
      Return 0
   EndIf
End Function

;####################################################
; NAME       : gxEnd(list)
; PARAMETER  : list     = Listenanfang
; BESCHREIBUG: Gibt letztes Element zurück
;####################################################
Function gxEnd(list_%)
   If(list_=0) Return 0

   While(PeekInt(list_,NEXT_)<>0)
      list_ = PeekInt(list_,NEXT_)
   Wend
   
   Return list_

End Function

;####################################################
; NAME       : gxFirst(list)
; PARAMETER  : list     = Listenanfang
; BESCHREIBUG: Gibt erstes Element zurück
;####################################################
Function gxFirst(list_%)
   Return list_
End Function

; GLOBAL FPS
Global TFPS
Global FPS
Global TimerFPS

Graphics3D 640,480,16,2

WireFrame 1

eCam%  = CreateCamera()
eLight%= CreateLight()

bRun%  = True

list% = gxCreateList()

timeStart  = MilliSecs()

For i=1 To 100
   mesh = gxLoadMesh(list,"plane.3ds")
   EntityColor(gxMesh(mesh),Rand(0,255),Rand(0,255),Rand(0,255))
   Cls
   Text 10,10,i*100/100+"%"
   Flip(0)
   Cls
Next

time = MilliSecs()-timeStart

MoveEntity eCam,0,0,-500
   
While(bRun)
   cnt%=0
   
   temp=list
   While(temp<>0)
      cnt=cnt+1
      TurnEntity(gxMesh(temp),1,Rand(1,4),1)
      temp=gxNext(temp)
   Wend

   RenderWorld()
   ShowFPS()
   Text 10,15,"Objekte :"+cnt
   Text 10,35,"Build   :"+time+"ms"
   Flip(0)
   Cls()
   If(KeyHit(1)) bRun = False
Wend

Function ShowFPS ()
   Color 255,255,0
   TFPS = TFPS + 1
   If MilliSecs () - TimerFPS => 1000 Then
      TimerFPS = MilliSecs ()
      FPS = TFPS
      TFPS = 0
   End If
   Text (10,0,"FPS : "+FPS)
End Function


Die Version mit Type

Code: [AUSKLAPPEN]

; TYPE
Type TENTITY
   Field ePlane
End Type

; GLOBAL FPS
Global TFPS
Global FPS
Global TimerFPS

Graphics3D 640,480,16,2

WireFrame 1

eCam%  = CreateCamera()
eLight%= CreateLight()

bRun%  = True

timeStart  = MilliSecs()

For i=1 To 100
   entity.TENTITY = New TENTITY
   entity\ePlane = LoadMesh("plane.3ds")
   EntityColor(entity\ePlane,Rand(0,255),Rand(0,255),Rand(0,255))
   Cls
   Text 10,10,i*100/100+"%"
   Flip(0)
   Cls
Next

time = MilliSecs()-timeStart

MoveEntity eCam,0,0,-500
   
While(bRun)
   cnt%=0
   temp=list

   For T.TENTITY = Each TENTITY
      cnt=cnt+1
      TurnEntity(T\ePlane,1,Rand(1,4),1)      
   Next

   RenderWorld()
   ShowFPS()
   Text 10,15,"Objekte :"+cnt
   Text 10,35,"Build   :"+time+"ms"
   Flip(0)
   Cls()
   If(KeyHit(1)) bRun = False
Wend

Function ShowFPS ()
   Color 255,255,0
   TFPS = TFPS + 1
   If MilliSecs () - TimerFPS => 1000 Then
      TimerFPS = MilliSecs ()
      FPS = TFPS
      TFPS = 0
   End If
   Text (10,0,"FPS : "+FPS)
End Function
Heute ist der erste Tag vom Rest deines Lebens
http://gombolo.go.funpic.de/

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group