Entity-/CameraPick - Über 1000ms ?

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

ToeB

Betreff: Entity-/CameraPick - Über 1000ms ?

BeitragSo, Sep 18, 2011 23:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo !

Mir ist heute beim durchgucken alter Codes ein Problem wieder eingefallen, was ich vor längerer Zeit mal hatte und ich da schon keine Antwort drauf wusste. Und zwar braucht bei mir sowohl EntityPick als auch CameraPick bis über eine Sekunde (~1376ms) Pro Aufruf ! Allerdings auch nicht immer.

Ich habe nämlich bei mir im Code folgendes stehen :
BlitzBasic: [AUSKLAPPEN]
Repeat
Maus_XS# = MouseXSpeed( )
Maus_YS# = MouseYSpeed( )
If Not KeyDown( 2 ) Then
MoveMouse 400, 300
TurnEntity Camera, Maus_YS/3.0, 0, 0, 0
TurnEntity Camera, 0, -Maus_XS/3.0, 0, 1
EntityPick( Camera, 1000 )
tmpPCube.Cube = CubePick( )
If tmpPCube <> PCube.Cube Then
PaintCube( PCube, 255, 255, 255 )
If tmpPCube <> Null Then PaintCube( tmpPCube, 255, 64, 64 )
PCube = tmpPCube
EndIf
;If PCube <> Null Then
If MouseHit( 1 ) Then
EntityPick( Camera, 1000 )
PCube.Cube = CubePick( )
CreateMapTile( PCube\info\Map, PCube\Mx, PCube\My, PCube\Mz, CubePickedSide, 2 )
EndIf
If MouseHit( 2 ) Then
;DeleteMapTile( PCube\info\Map, PCube\Mx, PCube\My, PCube\Mz )
EndIf
;EndIf
EndIf
MoveEntity Camera, 0, 0, (KeyDown( 17 )-KeyDown( 31 )) /5.0
RenderWorld()
UpdateWorld()
Flip 0
WaitTimer( Timer )
Cls
Until KeyHit( 1 )



Bei diesen Code kann passiert folgendes : Das Programm hängt sich beim Programmstart auf wegen dem erstmaligen EntityPick aufruf. Danach läuft alles Flüssig, auch EntityPick braucht nur zwischen 0-1ms. Drücke ich aber die Maustaste, so hängt sich alles schlagartig wieder auf, auch wenn ich EntityPick nicht nochmal aufrufe. Ich hab herausgefunden, dass EntityPick immer etwas braucht wenn ein Mesh erweitert wurde (Ja es sollte etwas Minecraft ähnliches sein), also ein Block hinzugefügt wurde. Kennt jemand das Problem und weiß wie man das beheben könnte ?

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!

ZaP

BeitragSo, Sep 18, 2011 23:47
Antworten mit Zitat
Benutzer-Profile anzeigen
1000 ist schon eine große Reichweite, geht das denn mit weniger?
Starfare: Worklog, Website (download)
 

PhillipK

BeitragMo, Sep 19, 2011 5:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Leider weiß ich nichts über das Pick zeugs, deswegen kann ich dir nicht helfen Sad

Die picking methoden habe ich nie angefasst. ebene weil es teilweise zu langsam ist Very Happy

Ich habe mich immer auf Collisions berufen, allerdings ist meine b3d zeit auch ewig her..

Klappt das ganze denn ohne pick?

Ich würde das ganze evtl über ein an die camera gepappten cube lösen. Dh nen cube an die cam/den spieler, welcher unsichtbar ist und per Collision rückmeldung gibt. Weiß allerdings nichtmehr, ob man irgendwie an das kollidierte objekt kommt :3

biggicekey

BeitragMo, Sep 19, 2011 9:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Was macht denn CubePick() ?
#45 www.icekeyunlimited.de www.starcrusade.de
Gewinner BCC#17 !!! mit dotkiller
Nothing more to register - you've cleaned us out![/size]

Noobody

BeitragMo, Sep 19, 2011 12:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist nicht CameraPick, sondern das erste CameraPick, welches nach grossen Veränderungen in der Geometrie sehr langsam ist. Der Grund dafür ist, dass Blitz natürlich eine Datenstruktur verwendet, um LinePick/CameraPick/EntityPick-Aufrufe schneller zu machen (einfach jedes einzelne Dreieck testen wäre ziemlich langsam Razz ). Diese muss neu gebaut werden, wenn man die Szene verändert. Da Blitz aber nicht weiss, wann man mit dem Verändern der Szene fertig ist und es mit dem Aufbauen der Datenstruktur beginnen kann, wartet es damit bis zum beim ersten Aufruf einer der Pick-Befehle. Dieser Aufruf ist dann entsprechend langsam.

Wenn die Geometrie einmal gebaut wird und nachher statisch bleibt, kann man einfach einen Pick-Befehl aufrufen, nachdem die Geometrie erstellt wurde, und man muss sich nachher im Spiel keine Sorgen mehr um Lags beim ersten Aufruf eines Pick-Befehls machen.

Bei einem Minecraft-ähnlichen Spiel geht das zwar nicht, allerdings wundere ich mich, dass Pick bei dir so lange braucht - bei Noocraft wurden die zuhauf verwendet und ich hatte eigentlich nie Probleme damit. Kannst du mal den Code posten, der für die Mesh-Erstellung zuständig ist? Vielleicht findet man ja da einen Übeltäter.

Man kann Alternativ zu Pick-Befehlen auch direkt auf dem Array arbeiten, in dem die Map gespeichert ist. Da es ja ein Minecraft-ähnliches Spiel wird, hast du nur Würfel und ein Array, das sie enthält. Darum kannst du einfach von der Kameraposition aus in Blickrichtung durch das Array gehen und anhalten, sobald ein voller Block gefunden wurde. Ein simpler Algorithmus wie etwa DDA funktioniert da super (Hier super beschrieben).
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

ToeB

BeitragMo, Sep 19, 2011 15:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke erstmal !

Die CubePick-Funktion macht folgendes :
BlitzBasic: [AUSKLAPPEN]
;###########################################################################################
Function CubePick.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
CubePicked = tmpCube
CubePickedSide = Ceil( Float(i+1) / 2.0 )
Return CubePicked
EndIf
Next
EndIf
Next
EndIf
Return Null
End Function

(Findet also heraus zu welchem Block das gepickte Triangle gehört (Und das ist sogar relativ schnell, braucht 6ms). Daran liegt es also nicht.

Um einen Cube hinzuzufügen, setzt ich einfach das den Punkt im Array auf den Gewünschten wert und zeichne das Komplette Surface neu (geht auch relativ schnell, ~6-10ms). Allerdings stockt danach immer direkt das Programm wieder, da, wie du schon gesagt hast, das Surface verändert wurde. Allerdings wundert es mich schon das es bei dir geht oO

Edit: Also bei dem Code kann man es merken: Die "PickZeit"(im Debuglog) erhöht sich nur solange, wie auch die rechte Maustaste gedrückt worden ist, danach wird wieder im bereich von 0-1ms gespielt, allerdings komme ich beim besten willen nicht auf 1000ms oO
BlitzBasic: [AUSKLAPPEN]
Graphics3D 800, 600, 16, 2
SetBuffer BackBuffer( )
SeedRnd MilliSecs()

Local camera = CreateCamera()
PositionEntity camera, 0, 5, -12

Local mesh = CreateMesh( )
EntityPickMode( mesh, 2 )
EntityFX( mesh, 2 )
Local surface = CreateSurface( mesh )

Global painted

Repeat
Local ms = MilliSecs()
CameraPick( camera, MouseX(), MouseY() )
DebugLog "Picktime : "+(MilliSecs() - ms)+"ms"

If MouseHit( 1 ) Then
PaintPickedTriangle( mesh )
EndIf

If MouseDown( 2 ) Then
AddTriangleToMesh( surface )
EndIf
RenderWorld()
Flip
Until KeyHit( 1 )
End


Function PaintPickedTriangle( tmpMesh )

If PickedEntity( ) = tmpMesh Then
Local tmpsurface = PickedSurface()
Local tmptriangle = PickedTriangle()
If painted <> tmptriangle Then
Local v0 = TriangleVertex( tmpSurface, painted, 0 )
Local v1 = TriangleVertex( tmpSurface, painted, 1 )
Local v2 = TriangleVertex( tmpSurface, painted, 2 )
VertexColor( tmpSurface, v0, 255, 255, 255, 1 )
VertexColor( tmpSurface, v1, 255, 255, 255, 1 )
VertexColor( tmpSurface, v2, 255, 255, 255, 1 )
painted = tmptriangle
v0 = TriangleVertex( tmpSurface, painted, 0 )
v1 = TriangleVertex( tmpSurface, painted, 1 )
v2 = TriangleVertex( tmpSurface, painted, 2 )
VertexColor( tmpSurface, v0, 255, 64, 255, 1 )
VertexColor( tmpSurface, v1, 255, 64, 255, 1 )
VertexColor( tmpSurface, v2, 255, 64, 255, 1 )
EndIf
EndIf
End Function

Function AddTriangleToMesh( tmpSurface )
Local v0 = AddVertex( tmpSurface, Rnd( -10.0, 10.0 ), Rnd( -10.0, 10.0 ), Rnd( -10.0, 10.0 ) )
Local v1 = AddVertex( tmpSurface, Rnd( -10.0, 10.0 ), Rnd( -10.0, 10.0 ), Rnd( -10.0, 10.0 ) )
Local v2 = AddVertex( tmpSurface, Rnd( -10.0, 10.0 ), Rnd( -10.0, 10.0 ), Rnd( -10.0, 10.0 ) )
AddTriangle( tmpSurface, v0, v1, v2 )
AddTriangle( tmpSurface, v2, v1, v0 )
End Function


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!

ToeB

BeitragMo, Sep 19, 2011 15:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Sry für doppelpost, aber hat sich jetzt erledigt.

Ich hab einfach mal statt für jeden "MapBlock" ein Surface jedesmal ein Mesh mit einem Surface eingesetzt und siehe da, es läuft wunderbar schnell, außer das es noch ein wenig ruckelt wenn man Blöcke setzt, aber das kriegt man auch iwann noch hin ..

Danke auf jeden Fall !

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!

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group