FPS Test Single Surface

Übersicht BlitzBasic Blitz3D

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

 

IonPainter

BeitragDi, Jan 29, 2008 19:10
Antworten mit Zitat
Benutzer-Profile anzeigen
79 / 69
Q6600 @ 4,2 Ghz
8800GTS 512 MB
XP x64

aMul

Sieger des Minimalist Compo 01/13

BeitragDi, Jan 29, 2008 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
@hectic:
Da muss ich dir widersprechen.
Der ganze Verwaltungskram ist, solange man nicht wirklich jedes Poly jeden Frame verschiebt, schneller als das ständige Neuerstellen des gesamten Surfaces. Die Polys von "gelöschten" Sprites schiebt man dann einfach irgendwo hinter die Kamera, wo sie nicht mehr gerendert werden(eigentlich werden sie ja gerendert, aber man sieht sie da halt nicht mehr). Wenn man dann z.B. 200 Sprites gelöscht hat, zeichnet mal (einmal) das ganze Surface neu.
Diese Methode ist wirklich nur dann langsamer als die in Draw3D angewandte, wenn man wirklich jeden Frame alle Sprites verschiebt, massiv löscht und neu erstellt, und selbst dann nur minimal.

Man kann, wenn man sowieso nur selten ClearSurface() aufruft sogar die Vertices von gelöschten Sprites in einem anderen Type speichern und bei Bedarf wieder hervorholen. Diese Methode ist allerdings, nach meinen Tests in allen Fällen leicht langsamer als die, alle 200 gelöschte Sprites das Surface zu löschen.

Ich habe das ganze allerdings auch nur auf meinem Rechner getestet.
Es mag durchaus sein, dass andere Grafikkarten da anders drauf sind.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver
 

Matthias

BeitragDi, Jan 29, 2008 20:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay. Ich habe Jetzt mal versucht mein Prinzip in Realität um zu setzen.
Also Meiner Meinung nach läuft es sehr schnell.

volle Belastung 170FPS Wieviel habt ihr?

Einfach da wo VolleBelastung steht aktivieren.
Dafür das darüber deaktivieren.



Code: [AUSKLAPPEN]

Graphics3D 800,600,32,2
Global MaxPatikel=16000
Global IstPatikel
Global MaxQuellPat
Global PatikelUpdateTakt
Global MaxPatikelStep=40
Dim Patikel#(MaxPatikel*16)
Dim PatikelMesh(10)
Dim QPatikel#(5000*16)
Dim PatFarbe(MaxPatikelStep*4+4)

SeedRnd(MilliSecs())
;Patikel Eigenschafften
;0=QuellID
;1=XPos
;2=YPos
;3=ZPos
;4=XMove
;5=YMove
;6=ZMove
;7=IstZyklus







For I=0 To MaxPatikelStep
  R=255-I*2 R=R*(R>0) PatFarbe(I*4+0)=R ;Rot
  G=255-I*4 G=G*(G>0) PatFarbe(I*4+1)=G ;Grün
  B=0       B=B*(B>0) PatFarbe(I*4+2)=0 ;Blau 
Next


InitPatikelMesh()
InitCamera()
CreateQuellPatikel()






SetBuffer BackBuffer()
Repeat

  MS=MilliSecs():FPSz=FPSz+1
  If MS>FPSt Then FPSt=MS+999:FPS=FPSz:FPSz=0
       
  UpdatePatikel(20):If KeyDown(57) Then CreatePatikel(80)
  ;UpdatePatikel(-1):CreatePatikel(80) ;VolleBelastung

     
 
 RenderWorld
 Text 10,10,FPS+" "+IstPatikel+"   Drücke Space"
 Flip 0
Until KeyDown(1)=1
End




Function UpdatePatikel(Takt)

If MilliSecs()<PatikelUpdateTakt Then Return
PatikelUpdateTakt=MilliSecs()+Takt


Surf=GetSurface(PatikelMesh(0),1)
V1=0:V2=1:V3=2:LastP=IstPatikel Shl 4

While I<IstPatikel Q=Patikel(P)
  Zyk=Patikel(P+7)+1:Patikel(P+7)=Zyk
 
  If Zyk=>MaxPatikelStep Then
    ;---ToterPatikel tauschen mit Letzten---
    For K=0 To 15 Patikel(P+K)=Patikel(LastP+K) Next
    Q=Patikel(P) V=IstPatikel*3
   ;----Den Letzten löschen----
    VertexCoords Surf,V,0,0,0
    VertexCoords Surf,V+1,0,0,0
    VertexCoords Surf,V+2,0,0,0
    IstPatikel=IstPatikel-1:LastP=IstPatikel Shl 4
  End If


  FarbWert=Zyk Shl 2
  R=PatFarbe(FarbWert+0):G=PatFarbe(FarbWert+1):B=PatFarbe(FarbWert+2)

  X#=Patikel(P+1)+Patikel(P+4):Patikel(P+1)=X:VertexColor Surf,V1,R,G,B
  Y#=Patikel(P+2)+Patikel(P+5):Patikel(P+2)=Y:VertexColor Surf,V2,R,G,B
  Z#=Patikel(P+3)+Patikel(P+6):Patikel(P+3)=Z:VertexColor Surf,V3,R,G,B

  VertexCoords Surf,V1,X+QPatikel(Q+3),Y+QPatikel(Q+4),Z+QPatikel(Q+5)
  VertexCoords Surf,V2,X+QPatikel(Q+6),Y+QPatikel(Q+7),Z+QPatikel(Q+8)
  VertexCoords Surf,V3,X+QPatikel(Q+9),Y+QPatikel(Q+10),Z+QPatikel(Q+11)
  V1=V1+3:V2=V2+3:V3=V3+3:I=I+1:P=P+16
Wend

If IstPatikel<1 Then HideEntity PatikelMesh(0)
End Function


Function InitCamera()
CameraPivot=CreatePivot()
CamRollPiv=CreatePivot(CameraPivot)
Camera=CreateCamera(CamRollPiv)
MoveEntity Camera,0,0,-5
;CameraClsColor Camera,0,0,200
Licht=CreateLight():TurnEntity Licht,45,45,0
End Function


Function CreateQuellPatikel()
Spalt#=0:Gr#=.025

Sphere=CreateSphere(50):Surf=GetSurface(Sphere,1)
MaxV=CountVertices(Surf)-1:RotateMesh Sphere,0,0,45

For I=0 To MaxV:X#=VertexX(Surf,I)
  Y#=VertexY(Surf,I):Z#=VertexZ(Surf,I)
  If X<-Spalt Or X>Spalt Then
    If Y<-Spalt Or Y>Spalt Then
      If Z<-Spalt Or Z>Spalt Then
         ;-----Zum Mittlepunkt drehen
        TFormVector Gr#,-Gr#,0,Piv,0
        QPatikel(J+3) = TFormedX#()
        QPatikel(J+4) = TFormedY#()
        QPatikel(J+5) = TFormedZ#()
        TFormVector -Gr#,-Gr#,0,Piv,0
        QPatikel(J+6) = TFormedX#()
        QPatikel(J+7) = TFormedY#()
        QPatikel(J+8) = TFormedZ#()
        TFormVector 0,0,0,Piv,0
        QPatikel(J+9) = TFormedX#()
        QPatikel(J+10) = TFormedY#()
        QPatikel(J+11) = TFormedZ#()   
        MaxQuellPat=MaxQuellPat+1:QPatikel(J+0)=X
        QPatikel(J+1)=Y:QPatikel(J+2)=Z::J=J+16
     End If
    End If
  End If

Next
  FreeEntity Sphere
End Function


Function CreatePatikel(AddMaxPat)
If IstPatikel=>MaxPatikel Then Return 


  For I=0 To AddMaxPat
    Speed#=Rnd(.02,.1)
    J=Rand(MaxQuellPat)*16
    PID=IstPatikel Shl 4
    Patikel(PID)=J:Patikel(PID+1)=0
    Patikel(PID+2)=0:Patikel(PID+3)=0

    Patikel(PID+4)=QPatikel(J)*Speed
    Patikel(PID+5)=QPatikel(J+1)*Speed
    Patikel(PID+6)=QPatikel(J+2)*Speed
    Patikel(PID+7)=0
    IstPatikel=IstPatikel+1
    If IstPatikel=>MaxPatikel Then Exit
  Next
ShowEntity PatikelMesh(0)
End Function






Function InitPatikelMesh()
MaxMesh=1
  For PM=0 To MaxMesh PatikelMesh(PM)=CreateMesh()
    Surf=CreateSurface(PatikelMesh(PM)):EntityFX PatikelMesh(PM),19

    For Tri=0 To MaxPatikel-1
        v1 = AddVertex(surf,0,0,0,1,1)
        v2 = AddVertex(surf,0,0,0,0,1)
        v3 = AddVertex(surf,0,0,0,1,0)
        AddTriangle(surf,v1,v2,v3)
    Next
  Next
End Function
  • Zuletzt bearbeitet von Matthias am Di, Jan 29, 2008 20:21, insgesamt einmal bearbeitet

aMul

Sieger des Minimalist Compo 01/13

BeitragDi, Jan 29, 2008 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Pendelt sich bei mir etwa bei 60 FPS ein.
Weil ich so lieb bin, hier nochmal meine Hardware:
Athlon64 3200+ | 2048mb Ram | Radeon 850Pro Wink
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

PSY

BeitragDo, Jan 31, 2008 17:47
Antworten mit Zitat
Benutzer-Profile anzeigen
@Dreamora

stimmt, hab bei jedem Durchlauf clearsurface ausgeführt und alles neu erstellt ...

Habs jetzt mal mit Particlepool gemacht, hier die Ergebnisse (Partikel waren grosse, bunte Herze, 32x32 Texturen)

versuch 1:
a) 15300 particle darstellen mit clearsurface + vertices neu erstellen : 48 FPS
b) 15300 particle darstellen mit festem particlepool von 15300 + vertices nur bewegen, particle ausserhalb des sichtbaren bereichs nicht rendern (noch steigerungsfähig) 65 FPS


versuch 2:
a) 2040 particle darstellen mit clearsurface + vertices neu erstellen: 285 fps
b) 2040 particle darstellen mit festem particlepool von 15300 + vertices nur bewegen, particle ausserhalb des sichtbaren bereichs nicht rendern160 FPS

versuch 3
a) wie versuch 2 285 fps
b) wie versuch 2, aber mit variablem particlepool (geht in diesem fall nicht über 2040 particle) 377 FPS

Fazit:
Der minimale Mehraufwand zur Verwaltung eines dynamischen Particlepools macht sich aufgrund der (teilweise) extremen Geschwindigkeitssteigerung auf jeden Fall bezahlt

Bei meinen Versuchen hab ich teilweise sogar eine gleichmässigere Bewegung bei Versuchsreihe b) festgestellt, wenn abwechselnd sehr wenige und sehr viele Partikel auf einmal dargestellt wurden. Leider waren beide Engines zu diesem Zeitpunkt noch nicht Test-final, also keine 100%ige Angabe hierzu.

FRAGE:
Sobald die Particellebenszeit abgelaufen ist oder alpha <= 0, werden die Partikel bei a) gelöscht und bei b) einfach hinter die CAM verschoben.
Wie teste ich am einfachsten (schnellsten), ob ein Partikel noch sichtbar, also in der Cam, ist (um ihn sofort löschen zu können, falls er ausserhalb des sichtbaren Bildschirms gerät)?

L8er,
PSY

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group