[B3D] EntityDistance
Übersicht

![]() |
StepTigerBetreff: [B3D] EntityDistance |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
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#)
achja, wie man in dieser zeile sieht, reicht auch ein sqr aus... ist dann fast doppelt so schnell Return Sqr(((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2))+((z1-z2)*(z1-z2))) End Function ![]() |
||
MrKeks.net |
- Zuletzt bearbeitet von Mr.Keks am Mo, Aug 07, 2006 15:55, insgesamt einmal bearbeitet
![]() |
Suco-X |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
![]() |
Suco-X |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
![]() |
StepTiger |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() PS: Dieser Code beweißt, dass EntityDistance das langsamste ist. ![]() 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 ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
![]() |
Suco-X |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() *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 ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group