Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

11

09.11.2014, 11:33

Die Grundaussage ist also: Du willst diesen Code gar nicht nach C++ übersetzen. Du willst stattdessen herausfinden, was er produktives tut, und das in C++ nachbilden. Falls die floor()-Hypothese von dot stimmt, hast Du die C++-Entsprechung bereits: floor().
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

12

09.11.2014, 12:19

Das "fastftol" macht effektiv nichts weiter als einen Cast von Float nach Long. Das "SnapVector" tut dasselbe für alle drei Komponenten des Vektors.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

09.11.2014, 12:47

Das "fastftol" macht effektiv nichts weiter als einen Cast von Float nach Long. Das "SnapVector" tut dasselbe für alle drei Komponenten des Vektors.

...und weist das Ergebnis wieder an einen float zu...

Was fistp tut, hängt vom aktuellen FPU Rounding Mode ab, der standardmäßig auf die näheste Ganzzahl rundet und nicht abrundet. Meine std::floor() Hypothese stimmt also nur bedingt, es könnte auch std::round() oder std::ceil() sein (am wahrscheinlichsten ist wohl round())...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

14

09.11.2014, 18:30

...und weist das Ergebnis wieder an einen float zu...
Nun, "fastftol" weißt gar nichts zu, sondern gibt einen int zurück.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

15

09.11.2014, 18:53

...und weist das Ergebnis wieder an einen float zu...
Nun, "fastftol" weißt gar nichts zu, sondern gibt einen int zurück.

Ich bezog mich natürlich auf Sys_SnapVector ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

16

09.11.2014, 19:00

Ich bin mal davon ausgegangen, dass es logisch ist, dass nach einem solchen Cast der Komponenten sie wieder rein gespeichert werden. Sonst wäre das ja effektiv nur ein sinnloses NOP. Daher hatte ich das nicht weiter ausgeführt. Hätte ich's gemacht, hätte ich mir wohl diese sinnlose Diskussion sparen können.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

17

09.11.2014, 19:19

Ich wollte lediglich darauf hinweisen, dass die nach int gecasteten floats in einen float und nicht in einen int zurückgespeichert werden, was dazu führt, dass zusätzlich noch eine implizite int nach float Conversion stattfindet...

Wenn man eine SSE 4 fähige CPU voraussetzen kann, würde man für eine heutzutage effiziente Lösung wohl den _mm_floor_ss() intrinsic verwenden (sofern der Compiler sich nicht dazu bewegen lässt, von selbst die passende roundss Instruction zu emittieren)...

Noch ein Hiweis am Rande, weil's mir gerade auffällt: Die Funktion fastftol hier ist nicht threadsafe.

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »dot« (09.11.2014, 19:30)


Werbeanzeige