Viele Würfel ohne FPS-Einbrüche?
Übersicht

![]() |
BadudelBetreff: Viele Würfel ohne FPS-Einbrüche? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group