Speed geht bei vielen Sprites in den Keller, Optimierung..?

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

IonPainter

Betreff: Speed geht bei vielen Sprites in den Keller, Optimierung..?

BeitragMi, Feb 18, 2004 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
habe mir folgende funktion geschrieben:
Code: [AUSKLAPPEN]

Function EmitBaum(x#, y#, z#)

   Baum.BaumDaten = New BaumDaten
   
   Baum\Baum1 = LoadSprite("baum.bmp",4+1)
   Baum\Baum2 = LoadSprite("baum.bmp",4+1)
   SpriteViewMode Baum\Baum2, 2
   TurnEntity Baum\Baum2, 0, 90, 0
   SpriteViewMode Baum\Baum1, 2
   EntityFX Baum\Baum1, 16
   EntityFX Baum\Baum2, 16
   ScaleSprite Baum\Baum1, 5, 5
   ScaleSprite Baum\Baum2, 5, 5
   PositionEntity Baum\Baum1, x, y, z
   PositionEntity Baum\Baum2, x, y, z

End Function


und wollte jetzt ein *kleines* wäldchen anlegen:

Code: [AUSKLAPPEN]

For x = 1 To 1000 Step 25
                For z = 1 To 1000 Step 25
      EmitBaum(x,5,z)
   Next
Next


leider geht bei mir der speed richtig in den keller (5 fps) und das obwohl die grafikkarte nicht gerade die schlechteste ist (Radeon 9800)

gibt es optimierungsmöglichkeiten um wieder in einen annehmbaren framebereich zu kommen, oder muss ich den wald roden? Laughing

IonPainter
 

INpac

BeitragMi, Feb 18, 2004 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm...
du könntest vielleicht ein single-surface-system coden, wenn die bäume nicht mehr bewegt und irgendwie modifiziert werden.
das sollte dann akzeptabel schnell gehen..
oder du versuchst mal, die anzahl der sprites zu reduzieren, aber im VRAM-mode die sprites zu laden, also "...,4+1+256)"
 

IonPainter

BeitragMi, Feb 18, 2004 20:42
Antworten mit Zitat
Benutzer-Profile anzeigen
hab mal nen anderen ansatz versucht:

Code: [AUSKLAPPEN]

BaumTex = LoadTexture("baum.bmp")
   
   BaumX = CreateMesh()
   
   Surface = CreateSurface(BaumX)
   
   V1 = AddVertex(Surface, 0, 0, 0)
   V2 = AddVertex(Surface, -1, 0, 0)
   V3 = AddVertex(Surface, 0, 1, 0)
   V4 = AddVertex(Surface, -1, 1, 0)

   S1 = AddTriangle(Surface, v1, v2, v3)
   S2 = AddTriangle(Surface, v4, v2, v3)
   
   EntityFX BaumX, 16
   
   EntityTexture BaumX, BaumTex


das scheitert allerdings schon am texturieren, das mesh bleibt immer schwarz, die textur is 100% da, als sprite kann ich sie ja laden, woran kann das liegen?
 

darkshadow

BeitragMi, Feb 18, 2004 20:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Texkoords nicht richtig gesetzt?
 

IonPainter

BeitragMi, Feb 18, 2004 20:51
Antworten mit Zitat
Benutzer-Profile anzeigen
jup das wars...
 

IonPainter

BeitragMi, Feb 18, 2004 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
so jetzt habe ich zwar einen sprite ersatz, bekomme die eizelnen meshes aber nicht zusammengefasst.

Code: [AUSKLAPPEN]

BaumX = CreateMesh()
   
   Surface = CreateSurface(BaumX)
   
   V1 = AddVertex(Surface, 0, 0, 0, 1, 0)
   V2 = AddVertex(Surface, -1, 0, 0, 0, 0)
   V3 = AddVertex(Surface, 0, 1, 0, 1, 1)
   V4 = AddVertex(Surface, -1, 1, 0, 0, 1)

   S1 = AddTriangle(Surface, v1, v2, v3)
   S2 = AddTriangle(Surface, v4, v2, v3)
   
   EntityFX BaumX, 16
   
   BaumTex = LoadTexture("baum.bmp",1+4+256)

   Wald = CreateMesh()

   For x = 1 To 1000 Step 25
      For z = 1 To 1000 Step 25
         EmitBaum(x,0,z)
      Next
   Next


und die funktion:

Code: [AUSKLAPPEN]

Function EmitBaum(x#, y#, z#)

   Baum1 = CopyEntity(Baumx)
   Baum2 = CopyEntity(Baumx)
   
   TurnEntity Baum2, 0, 90, 0
   
   PositionEntity Baum1, x+.5, y, z-.5
   PositionEntity Baum2, x, y, z
      
   EntityTexture Baum1, BaumTex
   EntityTexture Baum2, BaumTex
   
   AddMesh Baum1, Wald
   AddMesh Baum2, Wald
      
   FreeEntity Baum1
   FreeEntity Baum2
   
End Function


wenn ich das freeentity auskommentiere sind die bäume zwar drin aber halt 1600 meshes, lasse ich freeentity drin, sehe ich garnichts von den bäumen.

Shodan

BeitragMi, Feb 18, 2004 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Innerhalb von EmitBaum() ist
Code: [AUSKLAPPEN]

   PositionEntity Baum1, x+.5, y, z-.5
   PositionEntity Baum2, x, y, z

verkehrt.
Du musst PositionMesh benutzen.
Code: [AUSKLAPPEN]

   PositionMesh Baum1, x+.5, y, z-.5
   PositionMesh Baum2, x, y, z

sonst stehen alle Bäume im Wald-Mesh auf der selben Stelle. Die Bäume, die verteilt standen, waren die kopierten Bäume Baum1 u. Baum2. Deswegen war scheinbar nix mehr da, wenn FreeEntity aktiv ist Wink
 

IonPainter

BeitragMi, Feb 18, 2004 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
gut hab jetzt ein wald und ein weiteres prob, will ein bissl fake-cullen nur geht das irgendwie nicht:

Code: [AUSKLAPPEN]

Const BaumMeshes = 3
Const Baeume = 3

Dim Wald(1000)

Global TFPS
Global FPS
Global TimerFPS

AppTitle "THE BAUM! by IonPainter"
Graphics3D 800, 600, 32, 2
SetBuffer BackBuffer()

Kamera = CreateCamera()
MoveEntity Kamera, 0, 5, -1
CameraRange Kamera, 0.01, 1000 ;<---###########################


Global BaumX = CreateMesh()

BaumBrush = LoadBrush("baum.bmp",1+4+256)   
   
Surface = CreateSurface(BaumX,BaumBrush)
   
V1 = AddVertex(Surface, 0, 0, 0, 1, 1)
V2 = AddVertex(Surface, -1, 0, 0, 0, 1)
V3 = AddVertex(Surface, 0, 1, 0, 1, 0)
V4 = AddVertex(Surface, -1, 1, 0, 0, 0)

S1 = AddTriangle(Surface, v1, v2, v3)
S2 = AddTriangle(Surface, v4, v2, v3)

HideEntity BaumX
   
For x = 1 To 1000 Step BaumMeshes ;<---##################################
   Wald(i) = CreateMesh()
   EntityFX Wald(i), 16
   
   For z = 1 To 1000 Step Baeume ;<---##################################
      EmitBaum(x,0,z,i)
   Next
   
   i=i+1
Next


While Not KeyHit(1)

   If KeyDown(200) Then MoveEntity Kamera, 0, 0, .1
   If KeyDown(208) Then MoveEntity Kamera, 0, 0, -.1
   If KeyDown(203) Then TurnEntity Kamera, 0, 1, 0
   If KeyDown(205) Then TurnEntity Kamera, 0, -1, 0
      
   ;Fake Culling
   
   For Zaehler = 0 To i
   If EntityDistance(Kamera, Wald(Zaehler)) > 100 Then
      HideEntity Wald(Zaehler)
   Else
      ShowEntity Wald(Zaehler)
   EndIf
   Next


   UpdateWorld
   RenderWorld

   Text 0,0,"Polys: "+TrisRendered()
   showfps()
   
   Flip 0
   
Wend

Function EmitBaum(x#, y#, z#, i)

   Baum1 = CopyMesh(Baumx)
   Baum2 = CopyMesh(Baumx)
   
   RotateMesh Baum2, 0, 90, 0
   
   PositionMesh Baum1, x+.5, y, z-.5
   PositionMesh Baum2, x, y, z
   
   ScaleMesh Baum1, 4, 4, 4
   ScaleMesh Baum2, 4, 4, 4
   
   AddMesh Baum1, Wald(i)
   AddMesh Baum2, Wald(i)
      
   FreeEntity Baum1
   FreeEntity Baum2
   
End Function

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


man kommentiere das culling aus und schon läufts, aber warum zum henker kann ich keine entitydistance berechnung auf meinen wald anwenden?

Shodan

BeitragMi, Feb 18, 2004 23:21
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Achte mal auf deine Zählervariablen. i ist um 1 zu hoch am ende der Baumerstellung und deine Culling-Schleife fängt bei 0 an anstatt bei 1 !

Desweiteren solltest du die einzelnen Bäume in Quadraten anordnen und nicht in langen Reihen. das lässt sich besser cullen. Den Mittelpunkt der Meshes im Zentrum des Quadrats vorrausgestzt.

Markus2

BeitragDo, Feb 19, 2004 1:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

haste mal direkt mit neuerBaum=CopyEntity(MasterBaum) versucht ?
Und AutoFade gesetzt ?
Also 1600 Bäume sind ja nicht gerade viel .
Desweiteren kannste die Bäume auch nach dem Clonen mit
ScaleEntity größer oder kleiner machen .

Übrigens ist ein Wald als ganzes (ein Mesh) nicht so gut für die performance .
 

IonPainter

BeitragDo, Feb 19, 2004 10:24
Antworten mit Zitat
Benutzer-Profile anzeigen
ko hab ich probiert mit =CopyEntity(MasterBaum). dann ist der speed so bei 5 fps...

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group