FPS Test Single Surface
Übersicht

IonPainter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
79 / 69
Q6600 @ 4,2 Ghz 8800GTS 512 MB XP x64 |
||
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Pendelt sich bei mir etwa bei 60 FPS ein.
Weil ich so lieb bin, hier nochmal meine Hardware: Athlon64 3200+ | 2048mb Ram | Radeon 850Pro ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group