[B3D] EntityDistance

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

StepTiger

Betreff: [B3D] EntityDistance

BeitragMo, Aug 07, 2006 13:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ja,

Ihr wisst ja sicherlich, dass EntityDistance ELEND langsam ist.

also hier mal eine kleine Funktion, mit der ihr die Distanz messen könnt.

Nicht nur bei einzelnen Objekten sondern auch bei Vertex-Punkten.

der Code:
Code: [AUSKLAPPEN]
xdist#=(x#-EntityX(objekt,1))
ydist#=(y#-EntityY(objekt,1))
zdist#=(z#-EntityZ(objekt,1))
xzdist#=Sqr(xdist#^2+zdist#^2)
xyzdist#=Sqr(xzdist#^2+ydist#^2)


x# y# z# vorher messen
und statt objekt, das objekt, wo die Distanz gemessen werden soll.

Ist sehr sehr sehr viel schneller als EntityDistance

Formel schließt sich aus dem Satz des Pythagoras
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Mr.Keks

BeitragMo, Aug 07, 2006 14:05
Antworten mit Zitat
Benutzer-Profile anzeigen
also zumindest bei mir ist entitydistance nicht langsamer... wäre auch schwachfug, da es genau so auf dem satz des pythargoras basiert, wie deins ^^.

satzdespythargoras-geschichten sind immer so langsam, weil sqr() eine recht rechenintensive operation ist. du hast jetzt gleich zwei mal sqr() drin, was eigentlich ziemlich bremsen sollte. dazu verwendest du auch noch dist^2, wobei doch dist*dist schneller ist (bei ^-zeugs wird ein komplexerer algo verwendet, da du ja auch x^1.234 schreiben kannst..)


... im codearchiv ist es übrigens schöner, wenn du das ganze als funktion reinstellst. also in etwa so:

Code: [AUSKLAPPEN]
Function Util_CoordinateDistance#(x1#,y1#,z1#,x2#,y2#,z2#)
   Return Sqr(((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2))+((z1-z2)*(z1-z2)))
End Function
achja, wie man in dieser zeile sieht, reicht auch ein sqr aus... ist dann fast doppelt so schnell Wink. und entitydistance hat ziemlich genau denselben code wie diese funktion, schätze ich mal. nur dass der mit c++ und somit mit schnelleren math-befehlen geschrieben wurde. es wäre also komplett unlogisch, wenn entitydistance elend lahm wäre (=
MrKeks.net
  • Zuletzt bearbeitet von Mr.Keks am Mo, Aug 07, 2006 15:55, insgesamt einmal bearbeitet

Suco-X

BeitragMo, Aug 07, 2006 14:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:

Ihr wisst ja sicherlich, dass EntityDistance ELEND langsam ist.


Tja, nach einem Speedtest kann ich Inaries Meinung nur teilen. Aber für dich habe ich auch noch einen kleinen Ratschlag, StepTiger.

Zitat:

Wer eigenes Nicht-Wissen als Unwissenheit anderer deklariert, unterstreicht damit seine eigene "Unwissenheit"

Das zum Thema, dass die B3D Funktion Elend langsam sein soll.

Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB
 

BIG BUG

BeitragMo, Aug 07, 2006 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hatte bzgl. Kollision auch mal rumprobiert und EntityDistance war die mit Abstand schnellste Lösung. Ein Vergleich ohne Wurzel und dafür mit dem quadrierten Ergebnis war merklich langsamer, ebenso ein BoundingBox-Vergleich...
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

StepTiger

BeitragMo, Aug 07, 2006 22:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Suco-X hat Folgendes geschrieben:
Zitat:

Ihr wisst ja sicherlich, dass EntityDistance ELEND langsam ist.


Tja, nach einem Speedtest kann ich Inaries Meinung nur teilen. Aber für dich habe ich auch noch einen kleinen Ratschlag, StepTiger.

Zitat:

Wer eigenes Nicht-Wissen als Unwissenheit anderer deklariert, unterstreicht damit seine eigene "Unwissenheit"

Das zum Thema, dass die B3D Funktion Elend langsam sein soll.

Mfg Suco


Das wundert mich sehr, mein lieber Suco-X, da ich bei meinen dynamischen Schatten feststellen musste, dass ich mit entitydistance etwa 17 fps hatte und mit meiner funktion 58.

Bewundernswert ^^
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Suco-X

BeitragMo, Aug 07, 2006 23:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weiß ja nicht, mit was für Berechnungen du in deiner Schattenroutine arbeitest. Aber ein einfacher Test mit n durchläufen zeigt, dass EntityDistance nunmal um einiges schneller ist. Natürlich habe ich Inaries Version genommen, da diese die 3D Distanz korrekt berechnet und die ^ Patzer nicht drin hat.
Bewundernswert ist höchstens, dass du es trotz 3 gegenteiligen Behauptungen immernoch nicht wahrhaben willst...Du bist nicht zufällig ein Bruder von DW Question
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

StepTiger

BeitragMo, Aug 07, 2006 23:17
Antworten mit Zitat
Benutzer-Profile anzeigen
sag, du zettelst gern streit an, da du dich selbst sehr überschätzt.

Wer sagt, dass ich es nicht wahr haben will.

Kann ja sein, dass es irgendwie schneller laufen sollte.

Ich meinte übrigens nicht dynamische schatten sondern dynamisches Licht. ^^ Mein Fehler

Ich habe eure tips angenommen und hab es so umfunktioniert:
Code: [AUSKLAPPEN]
xdist#=(x#-EntityX(tcam,1))
ydist#=(y#-EntityY(tcam,1))
zdist#=(z#-EntityZ(tcam,1))
xzdist#=Sqr(xdist#*xdist#+zdist#*zdist#)
xyzdist#=Sqr(xzdist#*xzdist#+ydist#*ydist#)


Ich beherze tips sehr gern.

Aber musst du denn immer gleich die anderen als dumm hinstellen, nur weil du vielleicht einen Weg weißt, der besser sein könnte?

Ich habe jetzt übrigens herausgefunden, warum es so schneller war:
Also so genau brauche ich die Werte, da ich die Koordinaten Vertex-genau wissen muss.
Das Problem war, dass ich immer einen Pivot erstellt habe. Bei poly modellen mit knapp 7000 vertexes (und das 30 mal) läuft es natürlich etwas langsamer ^^

Mein Angebot an dich:
Lass uns einfach Frieden schließen, da ich sowas innerhalb eines Forums, dessen Atmosphere ich sehr mag, nicht gerade für förderlich halte.

Außerdem ist doch so eine Atmosphere viel schöner Wink

PS:
Dieser Code beweißt, dass EntityDistance das langsamste ist. Wink
Das erste ist EntityDistance
Das zweite mein code
Das dritte ist Inaries code
Code: [AUSKLAPPEN]
Graphics3D 800,600,32,2

max=800000

Dim x#(max)
Dim y#(max)
Dim z#(max)

Local timer1[1]
Local timer2[1]
Local timer3[1]

piv=CreatePivot()

For i=1 To max
   x#(i)=Rnd(1000)-500
   y#(i)=Rnd(1000)-500
   z#(i)=Rnd(1000)-500
Next

sphere=CreateSphere()

timer1[0]=MilliSecs()
For i=1 To max
   PositionEntity piv,x#(i),y#(i),z#(i)
   tx=EntityDistance(piv,sphere)
Next
timer1[1]=MilliSecs()

timer2[0]=MilliSecs()
For i=1 To max
   xdist#=(x#(i)-EntityX(sphere,1))
   ydist#=(y#(i)-EntityY(sphere,1))
   zdist#=(z#(i)-EntityZ(sphere,1))
   xzdist#=Sqr(xdist#*xdist#+zdist#*zdist#)
   xyzdist#=Sqr(xzdist#*xzdist#+ydist#*ydist#)
Next
timer2[1]=MilliSecs()

timer3[0]=MilliSecs()
For i=1 To max
   tx=Util_CoordinateDistance#(x#(i),y#(i),z#(1),EntityX(sphere),EntityY(sphere),EntityZ(sphere))
Next
timer3[1]=MilliSecs()

Print timer1[1]-timer1[0]
Print timer2[1]-timer2[0]
Print timer3[1]-timer3[0]

WaitKey
End

Function Util_CoordinateDistance#(x1#,y1#,z1#,x2#,y2#,z2#)
   Return Sqr(((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2))+((z1-z2)*(z1-z2)))
End Function
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Suco-X

BeitragDi, Aug 08, 2006 2:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Das beweist er nur, weil er fehlerhaft ist. Du benutzt beim EntityDistance Test PositionEntity in der Schleife und bei den übrigen nicht. Nimm das PositionEntity raus und der Test ist korrekt. Wo wir wieder beim Anfang wären.
1: EntityDistance
2: Inarie
3: Dein Code
Wenn du die Distanz zwischen Vertexpunkten berechnen willst, ist natürlich Inaries Version die bessere. Aber für das vorgesehene Einsatzgebiet ist EntityDistance das schnellste.
Was meinst du mit Streit? Waren doch höchstens paar kleine Sticheleien Smile
Aber wenn dich das stört, werde ich ab sofort einfühlsamer sein.
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Jan_

Ehemaliger Admin

BeitragDi, Aug 08, 2006 8:44
Antworten mit Zitat
Benutzer-Profile anzeigen
@Suco, Pack ihn wieder ein!

Habe den Code mal berichtigt, und wollte zeigen, was die Vorberechnung/ vorabfrage von Werten bringt.
in diesem falle fast die Entitydistance geschwindigkeit.
Code: [AUSKLAPPEN]
Graphics3D 800,600,32,2

max=100000

Dim x#(max)
Dim y#(max)
Dim z#(max)
Dim piv(max)
Local timer1[1]
Local timer2[1]
Local timer3[1]
Local timer4[1]

For i=0 To max -1
   piv(i)=CreatePivot()
   x#(i)=Rnd(1000)-500
   y#(i)=Rnd(1000)-500
   z#(i)=Rnd(1000)-500
   PositionEntity piv(i),x#(i),y#(i),z#(i)
Next

sphere=CreateSphere()


timer1[0]=MilliSecs()
For i=0 To max -1
   tx=EntityDistance(piv(i),sphere)
Next
timer1[1]=MilliSecs()

timer2[0]=MilliSecs()
For i=0 To max -1
   blub(piv(i),sphere)
Next
timer2[1]=MilliSecs()

timer3[0]=MilliSecs()
For i=0 To max -1
   Util_CoordinateDistance#(EntityX(piv(i)),EntityY(piv(i)),EntityZ(piv(i)),EntityX(sphere),EntityY(sphere),EntityZ(sphere))
Next
timer3[1]=MilliSecs()

timer4[0]=MilliSecs()
sx=EntityX(sphere)
sy=EntityY(sphere)
sz=EntityZ(sphere)
For i=0 To max -1
   bla(EntityX(piv(i))-sx,EntityY(piv(i))-sy,EntityZ(piv(i))-sz)
Next
timer4[1]=MilliSecs()

Print timer1[1]-timer1[0]
Print timer2[1]-timer2[0]
Print timer3[1]-timer3[0]
Print timer4[1]-timer4[0]

WaitKey
End

Function Util_CoordinateDistance#(x1#,y1#,z1#,x2#,y2#,z2#)
   Return Sqr(((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2))+((z1-z2)*(z1-z2)))
End Function

Function blub(entity1,entity2)
   xdist#=(EntityX(entity1)-EntityX(entity2))
   ydist#=(EntityY(entity1)-EntityY(entity2))
   zdist#=(EntityZ(entity1)-EntityZ(entity2))
   xzdist#=Sqr(xdist#*xdist#+zdist#*zdist#)
   Return Sqr(xzdist#*xzdist#+ydist#*ydist#)
End Function

Function bla(f,g,b)
   Return Sqr((f*f)+(g*g)+(b*b))
End Function
between angels and insects

StepTiger

BeitragDi, Aug 08, 2006 10:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist aber wesentlich speicheraufwändiger und für dynamisches Licht nicht zu gebrauchen.

Und genau dafür nehm ich es ja. (deswegen auch das PositionEntity, ist ja nur bei EntityDistance notwendig.)

mit den Pivots vorher erstellen, bringt mir nix, da ich dann alle Vertexes einlesen müsste. Und das wäre doppelte Zeit. Verlangsamt also wesentlich.

Deshalb: Inaries Variante bringt mir am meißten Wink

*edit*:
Doch nicht, Jans Variante bringt mir am meißten ^^
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.
 

#Reaper

Newsposter

BeitragDi, Aug 08, 2006 12:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Um ehrlich zu sein, selbst in StepTigers SpeedTest, war bei mir EntityDistance() am schnellsten^^
Wechselte sich aber manchmal mit Inarie's ab.

Aber da StepTiger nunmal nicht den Abstand zwischen 2 Entitys berechnen lassen will, sondern zwischen Cam und Vertexpunkt, ist dann Inaries variante schon besser, wegen den PositionEntity etc. Wink
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

StepTiger

BeitragDi, Aug 08, 2006 13:24
Antworten mit Zitat
Benutzer-Profile anzeigen
bei meinem ist entitydistanz am schnellsten?

also bei mir kommt immer sowas wie:
123
107
76

oder
121
113
77

Inaries immer sehr konstant und meins immer etwas besser als entitydistance

und etwas umgeschrieben:
Code: [AUSKLAPPEN]
Graphics3D 800,600,32,2

max=800000

Dim x#(max)
Dim y#(max)
Dim z#(max)

Local timer1[1]
Local timer2[1]
Local timer3[1]
Local timer4[1]

piv=CreatePivot()

For i=1 To max
x#(i)=Rnd(1000)-500
y#(i)=Rnd(1000)-500
z#(i)=Rnd(1000)-500
Next

sphere=CreateSphere()

timer1[0]=MilliSecs()
For i=1 To max
PositionEntity piv,x#(i),y#(i),z#(i)
tx=EntityDistance(piv,sphere)
Next
timer1[1]=MilliSecs()

timer2[0]=MilliSecs()
For i=1 To max
xdist#=(x#(i)-EntityX(sphere,1))
ydist#=(y#(i)-EntityY(sphere,1))
zdist#=(z#(i)-EntityZ(sphere,1))
xzdist#=Sqr(xdist#*xdist#+zdist#*zdist#)
xyzdist#=Sqr(xzdist#*xzdist#+ydist#*ydist#)
Next
timer2[1]=MilliSecs()

timer3[0]=MilliSecs()
For i=1 To max
tx=Util_CoordinateDistance#(x#(i),y#(i),z#(1),EntityX(sphere),EntityY(sphere),EntityZ(sphere))
Next
timer3[1]=MilliSecs()

timer4[0]=MilliSecs()
For i=1 To max
xdist=x#(i)-EntityX(sphere)
ydist=x#(i)-EntityY(sphere)
zdist=x#(i)-EntityZ(sphere)
tx=Sqr(xdist*xdist+ydist*ydist+zdist*zdist)
Next
timer4[1]=MilliSecs()

Print timer1[1]-timer1[0]
Print timer2[1]-timer2[0]
Print timer3[1]-timer3[0]
Print timer4[1]-timer4[0]

WaitKey
End

Function Util_CoordinateDistance#(x1#,y1#,z1#,x2#,y2#,z2#)
Return Sqr(((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2))+((z1-z2)*(z1-z2)))
End Function

Ist Jans am schnellsten (123,105,76,64)
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group