Viele Würfel ohne FPS-Einbrüche?

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Badudel

Betreff: Viele Würfel ohne FPS-Einbrüche?

BeitragFr, März 04, 2011 14:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich versuche gerade eine Art Leveleditor zu bauen. Dabei arbeite ich ausschließlich mit Würfeln. Da die FPS in den Keller gehen, sobald ich viele Objekte erstelle, habe ich ein bisschen gesucht, und bin auf verschiedene Lösungsansätze gestoßen - funktioniert hat nichts.

Hier erstmal ein Code zum besseren Verständnis:
Anmerkung: Ich arbeite mit BMax / MiniB3D. Ich habe den Code für B3D umgeschrieben, aber konnte es nicht testen, da ich derzeit nur einen Apple habe. Ich hoffe, er funktioniert so.

BlitzBasic: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()

Global timer = CreateTimer(60)
Const KEY_W%=17, KEY_A%=30, KEY_S%=31,KEY_D%=32,KEY_ESCAPE%=1


Global campiv = CreatePivot()
Global camera = CreateCamera(campiv)

For x%=0 To 100
For y%=0 To 100
Add(x*2,y*2,0)
Next
Next



Repeat
Bewegung()
RenderWorld()
Flip 0
WaitTimer (timer)
Until KeyHit(KEY_ESCAPE)




Function Bewegung()
Local mXs% = MouseXSpeed()
Local mYs% = MouseYSpeed()

MoveMouse 400,300

TurnEntity campiv,0,-(mXs/3.0),0
TurnEntity camera,(mYs/3.0),0,0

If KeyDown(KEY_A) Then MoveEntity (campiv,-.1,0,0)
If KeyDown(KEY_D) Then MoveEntity (campiv,.1,0,0)
If KeyDown(KEY_W) Then MoveEntity (campiv,0,0,.1)
If KeyDown(KEY_S) Then MoveEntity (campiv,0,0,-.1)

End Function


Function Add(x%,y%,z%)
Local neu=CreateCube()
PositionEntity (neu,x,y,z)
End Function



Die Lösungsansätze waren:
- Sprites, Typ 2 (viel langsamer)
- Addmesh (auch langsamer, außerdem kann ich dann per CameraPick das gewählte Objekt schwer ermitteln)
- EntityAutoFade (viel langsamer)


Was mache ich am Besten, um die FPS hoch genug zu halten?

Grüße!
Wir werden dem Schwein schon schlachten, auch wenn ihm quiekt.
Zum Teufel mit das Grammatik!

ZaP

BeitragFr, März 04, 2011 14:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja also hier bietet sich Single Surface an, und Du wirst dir einen eigenen Pick-Algorithmus schreiben müssen, aber das sollte machbar sein.
Starfare: Worklog, Website (download)

ToeB

BeitragFr, März 04, 2011 17:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich hab mal schnell was zusammengestellt, damit kannst du deine 10000 Würfel zeichnen und hast trotzdem nur ca 5ms Zeichnen-Zeit...


Die Lib :
Code: [AUSKLAPPEN]
Type Buffer
   Field mesh
   Field surface
   Field texture, frame
   Field brush
End Type

Type Cube
   Field info.Buffer
   Field x#, y#, z#, size#
   Field v[23]
   Field t[11]
End Type

Global BufferMesh

;###########################################################################################
Function CreateBuffer.Buffer( tmpTexture=0, tmpTextureFrame=0 )
;###########################################################################################
;-------------------------------------------------------------------------------------------
;   tmpTexture - Texture Handle
;   tmpTextureFrame - Texture Frame Index (starts by 0)
;-------------------------------------------------------------------------------------------
   If BufferMesh = 0 Then
      BufferMesh = CreateMesh( )
      EntityFX( BufferMesh, 2 )
   EndIf
   Local tmpBuffer.Buffer = New Buffer
   tmpBuffer\Mesh = BufferMesh
   tmpBuffer\Texture = tmpTexture
   tmpBuffer\Frame = tmpTextureFrame
   tmpBuffer\Brush = CreateBrush( 255, 255, 255 )
   If tmpBuffer\Texture <> 0 Then BrushTexture( tmpBuffer\Brush, tmpBuffer\Texture, tmpBuffer\Frame )
   tmpBuffer\Surface = CreateSurface( tmpBuffer\Mesh, tmpBuffer\Brush )
   Return tmpBuffer
End Function

;###########################################################################################
Function AddCube.Cube( tmpBuffer.Buffer, tmpFlag=63, tmpX#=0, tmpY#=0, tmpZ#=0, size#=1 )
;###########################################################################################
;-------------------------------------------------------------------------------------------
;   tmpBuffer - Buffer Handle (CreateBuffer)
;   tmpFlag - Cube Sides :
;               1  - Front
;               2  - Back
;               4  - Left
;               8  - Right
;               16 - Top
;               32 - Bottom
;   tmpX, tmpY, tmpZ - Position of the Cube.
;   size - "Radius" of the Cube.
;-------------------------------------------------------------------------------------------
   Local tmpCube.Cube = New Cube
   tmpCube\Info = tmpBuffer
   tmpCube\x = tmpX
   tmpCube\y = tmpY
   tmpCube\z = tmpZ
   tmpCube\size = size
   DrawCube( tmpCube, tmpFlag )
   Return tmpCube
End Function

;###########################################################################################
Function DrawCube( tmpCube.Cube, tmpFlag=63 )
;###########################################################################################
;-------------------------------------------------------------------------------------------
;   tmpCube - Cube Object
;   tmpFlag - Cube Sides (Like AddCube)         
;-------------------------------------------------------------------------------------------
   If tmpCube = Null Then Return
   If (tmpFlag And 1) = 1 Then
      tmpCube\v[00] = AddVertex( tmpCube\info\surface, tmpCube\x-tmpCube\size, tmpCube\y+tmpCube\size, tmpCube\z+tmpCube\size, 0, 0 )
      tmpCube\v[01] = AddVertex( tmpCube\info\surface, tmpCube\x+tmpCube\size, tmpCube\y+tmpCube\size, tmpCube\z+tmpCube\size, 1, 0 )
      tmpCube\v[02] = AddVertex( tmpCube\info\surface, tmpCube\x+tmpCube\size, tmpCube\y-tmpCube\size, tmpCube\z+tmpCube\size, 1, 1 )
      tmpCube\v[03] = AddVertex( tmpCube\info\surface, tmpCube\x-tmpCube\size, tmpCube\y-tmpCube\size, tmpCube\z+tmpCube\size, 0, 1 )
      tmpCube\t[00] = AddTriangle( tmpCube\info\surface, tmpCube\v[2], tmpCube\v[1], tmpCube\v[0] )
      tmpCube\t[01] = AddTriangle( tmpCube\info\surface, tmpCube\v[0], tmpCube\v[3], tmpCube\v[2] )
   EndIf
   If (tmpFlag And 2) = 2 Then
      tmpCube\v[04] = AddVertex( tmpCube\info\surface, tmpCube\x+tmpCube\size, tmpCube\y-tmpCube\size, tmpCube\z-tmpCube\size, 1, 1 )
      tmpCube\v[05] = AddVertex( tmpCube\info\surface, tmpCube\x-tmpCube\size, tmpCube\y-tmpCube\size, tmpCube\z-tmpCube\size, 0, 1 )
      tmpCube\v[06] = AddVertex( tmpCube\info\surface, tmpCube\x-tmpCube\size, tmpCube\y+tmpCube\size, tmpCube\z-tmpCube\size, 0, 0 )
      tmpCube\v[07] = AddVertex( tmpCube\info\surface, tmpCube\x+tmpCube\size, tmpCube\y+tmpCube\size, tmpCube\z-tmpCube\size, 1, 0 )
      tmpCube\t[02] = AddTriangle( tmpCube\info\surface, tmpCube\v[4], tmpCube\v[5], tmpCube\v[6] )
      tmpCube\t[03] = AddTriangle( tmpCube\info\surface, tmpCube\v[6], tmpCube\v[7], tmpCube\v[4] )
   EndIf
   If (tmpFlag And 4) = 4 Then
      tmpCube\v[08] = AddVertex( tmpCube\info\surface, tmpCube\x-tmpCube\size, tmpCube\y+tmpCube\size, tmpCube\z+tmpCube\size, 0, 0 )
      tmpCube\v[09] = AddVertex( tmpCube\info\surface, tmpCube\x-tmpCube\size, tmpCube\y+tmpCube\size, tmpCube\z-tmpCube\size, 1, 0 )
      tmpCube\v[10] = AddVertex( tmpCube\info\surface, tmpCube\x-tmpCube\size, tmpCube\y-tmpCube\size, tmpCube\z-tmpCube\size, 1, 1 )
      tmpCube\v[11] = AddVertex( tmpCube\info\surface, tmpCube\x-tmpCube\size, tmpCube\y-tmpCube\size, tmpCube\z+tmpCube\size, 0, 1 )
      tmpCube\t[04] = AddTriangle( tmpCube\info\surface, tmpCube\v[8], tmpCube\v[9], tmpCube\v[10] )
      tmpCube\t[05] = AddTriangle( tmpCube\info\surface, tmpCube\v[10], tmpCube\v[11], tmpCube\v[8] )
   EndIf
   If (tmpFlag And 8) = 8 Then
      tmpCube\v[12] = AddVertex( tmpCube\info\surface, tmpCube\x+tmpCube\size, tmpCube\y+tmpCube\size, tmpCube\z+tmpCube\size, 0, 0 )
      tmpCube\v[13] = AddVertex( tmpCube\info\surface, tmpCube\x+tmpCube\size, tmpCube\y+tmpCube\size, tmpCube\z-tmpCube\size, 1, 0 )
      tmpCube\v[14] = AddVertex( tmpCube\info\surface, tmpCube\x+tmpCube\size, tmpCube\y-tmpCube\size, tmpCube\z-tmpCube\size, 1, 1 )
      tmpCube\v[15] = AddVertex( tmpCube\info\surface, tmpCube\x+tmpCube\size, tmpCube\y-tmpCube\size, tmpCube\z+tmpCube\size, 0, 1 )
      tmpCube\t[06] = AddTriangle( tmpCube\info\surface, tmpCube\v[14], tmpCube\v[13], tmpCube\v[12] )
      tmpCube\t[07] = AddTriangle( tmpCube\info\surface, tmpCube\v[12], tmpCube\v[15], tmpCube\v[14] )
   EndIf    
   If (tmpFlag And 16) = 16 Then
      tmpCube\v[16] = AddVertex( tmpCube\info\surface, tmpCube\x-tmpCube\size, tmpCube\y+tmpCube\size, tmpCube\z+tmpCube\size, 0, 0 )
      tmpCube\v[17] = AddVertex( tmpCube\info\surface, tmpCube\x+tmpCube\size, tmpCube\y+tmpCube\size, tmpCube\z+tmpCube\size, 1, 0 )
      tmpCube\v[18] = AddVertex( tmpCube\info\surface, tmpCube\x+tmpCube\size, tmpCube\y+tmpCube\size, tmpCube\z-tmpCube\size, 1, 1 )
      tmpCube\v[19] = AddVertex( tmpCube\info\surface, tmpCube\x-tmpCube\size, tmpCube\y+tmpCube\size, tmpCube\z-tmpCube\size, 0, 1 )
      tmpCube\t[08] = AddTriangle( tmpCube\info\surface, tmpCube\v[16], tmpCube\v[17], tmpCube\v[18] )
      tmpCube\t[09] = AddTriangle( tmpCube\info\surface, tmpCube\v[18], tmpCube\v[19], tmpCube\v[16] )
   EndIf
   If (tmpFlag And 32) = 32 Then
      tmpCube\v[20] = AddVertex( tmpCube\info\surface, tmpCube\x-tmpCube\size, tmpCube\y-tmpCube\size, tmpCube\z+tmpCube\size, 0, 0 )
      tmpCube\v[21] = AddVertex( tmpCube\info\surface, tmpCube\x+tmpCube\size, tmpCube\y-tmpCube\size, tmpCube\z+tmpCube\size, 1, 0 )
      tmpCube\v[22] = AddVertex( tmpCube\info\surface, tmpCube\x+tmpCube\size, tmpCube\y-tmpCube\size, tmpCube\z-tmpCube\size, 1, 1 )
      tmpCube\v[23] = AddVertex( tmpCube\info\surface, tmpCube\x-tmpCube\size, tmpCube\y-tmpCube\size, tmpCube\z-tmpCube\size, 0, 1 )
      tmpCube\t[10] = AddTriangle( tmpCube\info\surface, tmpCube\v[22], tmpCube\v[21], tmpCube\v[20] )
      tmpCube\t[11] = AddTriangle( tmpCube\info\surface, tmpCube\v[20], tmpCube\v[23], tmpCube\v[22] )
   EndIf
End Function



;###########################################################################################
Function PickedCube.Cube( )
;###########################################################################################
   If PickedEntity() = BufferMesh Then
      Local surface = PickedSurface()
      Local triangle = PickedTriangle()
      For tmpCube.Cube = Each Cube
         If tmpCube\info\surface = surface Then
            For i = 0 To 11
               If tmpCube\t[i] = triangle Then Return tmpCube
            Next
         EndIf
      Next
   EndIf
   Return Null
End Function


;###########################################################################################
Function PaintCube( tmpCube.Cube, tmpR=255, tmpG=255, tmpB=255, tmpA#=1 )
;###########################################################################################
;-------------------------------------------------------------------------------------------
;   tmpCube - Cube Object
;   tmpR, tmpG, tmpB, tmpA - Color (RGBA) of the Cube      
;-------------------------------------------------------------------------------------------
   If tmpCube = Null Then Return
   For i = 0 To 23
      VertexColor( tmpCube\info\surface, tmpCube\v[i], tmpR, tmpG, tmpB, tmpA )
   Next
End Function


Das Beispiel (Mit PickedCube) :
Code: [AUSKLAPPEN]
Include "Cube.bb"

Graphics3D 800, 600, 16, 2
SetBuffer BackBuffer( )

Const KEY_W%=17, KEY_A%=30, KEY_S%=31,KEY_D%=32,KEY_ESCAPE%=1, KEY_1=2

Global campiv = CreatePivot()
Global camera = CreateCamera(campiv)
Global light = CreateLight( )

;Global Tileset = LoadAnimTexture( "Tileset.png", 2, 32, 32, 0, 2 )

   For x%=0 To 100
      Local tmpBuffer.Buffer = CreateBuffer( );Tileset, Rand(0,1) )
      For y%=0 To 100
         Local flag = 1+2
         If x=0 Then flag = flag +4
         If x=100 Then flag = flag +8
         If y=100 Then flag = flag +16
         If y=0 Then flag = flag +32
         AddCube( tmpBuffer, flag, x*2, y*2, 10, 1 )
      Next
   Next
   
   UpdateNormals( BufferMesh )
   EntityPickMode( BufferMesh, 2 )
   
Global PCube.Cube = Null

Repeat
   tmpFrameMs = MilliSecs( )
   Bewegung()
   CameraPick( Camera, MouseX(), MouseY() )
   tmpCube.Cube = PickedCube( )
   If tmpCube <> PCube Then
      If PCube <> Null Then PaintCube( PCube, 255, 255, 255 )
      PCube = tmpCube
      PaintCube( PCube, 255, 0, 0 )
   EndIf
   RenderWorld( )
   Text 0, 0, tmpFrameTime+" ms"   
   Flip 0
   Cls
   tmpFrameTime = MilliSecs( ) - tmpFrameMs
Until KeyHit( 1 )
End 


Function Bewegung()
   Local mXs% = MouseXSpeed()
   Local mYs% = MouseYSpeed()

   MoveMouse 400,300

   TurnEntity campiv,0,-(mXs/3.0),0,1
   TurnEntity campiv,(mYs/3.0),0,0,0

   If KeyDown(KEY_A) Then MoveEntity (campiv,-.1,0,0)
   If KeyDown(KEY_D) Then MoveEntity (campiv,.1,0,0)
   If KeyDown(KEY_W) Then MoveEntity (campiv,0,0,.1)
   If KeyDown(KEY_S) Then MoveEntity (campiv,0,0,-.1)
   
   Wireframe( KeyDown(KEY_1) )
   
End Function



Ich hab in dem Fall jede Spalte von 100 Würfeln in ein "Buffer" (Surface) aufgeteilt, sodass es zu keinem MAV bei Renderworld fürht. Kann noch viel Optimiert werden, ist halt innerhalb einer halben stunde entstanden, aber ist dafür soch schon recht gut.

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Badudel

BeitragFr, März 04, 2011 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

danke euch beiden für die Hilfe.

Ich habe natürlich auch schon angefangen zu programmieren, und deshalb einen anderen Lösungsansatz für den Picked-Cube (weiß der Teufel warum, aber bei mir funktioniert Pickedsurface in der MiniB3D nicht richtig), und bin gerade wild am Sinus-Cosinus-Kaktus rumrechnen (hab tatsächlich schon Kopfweh).

Sollte ich innerhalb der nächsten Stunden immer noch keine richtige Routine zusammenhaben, bemühe ich mich auch mal ein bisschen in den Quellcode der EntitySurface-Funktion reinzuschauen, dann kann ich deinen Lösungsvorschlag verbauen.

Grüße!
Wir werden dem Schwein schon schlachten, auch wenn ihm quiekt.
Zum Teufel mit das Grammatik!

ZaP

BeitragFr, März 04, 2011 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest ja (wenn minib3d das kann) auch einfach für jeden Cube einen Pivot erstellen, dem eine EntityBox geben, und die dann einfach picken, aber das könnte auch wieder langsam sein, wer weiß...
Starfare: Worklog, Website (download)

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group