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

Anonymous

unregistriert

1

12.04.2003, 19:10

Tut-3D-Now

Hi,

was soll denn dies bringen, wenn die D3DX-Funktinen bereits auf SIMD optimiert sind ?

ciao,
TomCat :)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

12.04.2003, 20:16

Es soll dies bringen, dass Du verstehst, wie 3DNow! funktioniert und es auch da anwenden kannst, wo D3DX Dir keine passenden Funktionen bietet. Z.B. die von mir beschriebene Funktion zum Transformieren von Vektoren. Wenn Du direkt Tausende Vektoren transformierst (was ja eigentlich fast immer der Fall ist), dann ist die vielfach schneller als wenn Du für jeden einzelnen Vektor die D3DX-Funktion aufrufst.
Und es soll ja auch noch Leute geben, die nicht die D3DX-Klassen verwenden (mich zum Beispiel - ich verwende es nur für's Laden von Texturen)...

3

19.04.2003, 05:28

Wenn ich jetzt meine eigenen Mathe Funktionen schreibe, kann ich sie ja nicht einfach auf 3DNow Optimieren. Dann Funktionieren sie ja nicht mehr, wenn die CPU kein 3DNow hat. Ich muss also immer eine Alternative anbieten können. Allerdings sollte man nicht einfach zwei Funktionen anbieten wie

Quellcode

1
2
CrossProduct();
CrossProduct3DNow();

Üble Sache.

Wie würdet ihr eine Automatische umschaltung für die jeweilige Optimierung realisieren?
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

19.04.2003, 09:58

Das könnte man schon tun, und dann mit Funktionszeigern arbeiten! Wenn die CPU 3DNow! unterstützt, dann zeigt der Zeiger auf die 3DNow!-Version, und ansonsten halt auf die normale. So ähnlich, wie wir das auch schon mit unserer G3D-Engine gemacht hatten ;)
Achja, übrigens: Ein Kreuzprodukt mit 3DNow! zu berechnen, lohnt sich nicht, weil ja immer noch das "femms" am Anfang und am Ende stehen muss. Es sei denn, das ist Teil eines größeren "femms"-Blocks.

Maverick

Frischling

Beiträge: 14

Wohnort: Paderborn

Beruf: IT Fachinformatiker ANW

  • Private Nachricht senden

5

19.04.2003, 11:59

Eigentlich, ist dieser aufwand völlig unnötig, man braucht nur den richtigen Compiler, klar der VC6.0 erzeugt 486 Code, der .net ist zwar besser, aber auch nicht das gelbe vom ei. Ich benutzen einfach den neusten Intel Compiler uns schon habe ich den Optimierten Code, die von Hand Optimierung bringt da zwar noch mal 10 % aber dafür verliere ich jegliche Corss Plattform Tauglichkeit. Man sollte auch den umstand ausnutzen, das der Compiler aus Templates wesentlich schnelleren Code erzeugen kann, als aus normalen Methoden. Für die eigentliche Transformation der 3D Objekte würde ich die shader benutzen, speed mäßig, gibt es nix besseres. Und für Kollisionserkennung reicht die Oben genante Methode völlig aus.

Man sollte sich auch mal Gedanken darüber machen, ob man das 3D Mesh, des Objektes überhaupt für die Kollision benutzen sollte, eine Variante mit reduzierten Polygonen ist wesentlich schneller, und nicht unbedingt ungenauer. Bei Objekten jenseits der 100.000 tris geht es auch nicht anders. Die GPU kann so was Rendern, die CPU definitiv NICHT! Eine Optimierte Engine Architektur bringt da mehr, als das 10 % Gefummel. Also erst per box prüfen, dann Peer reduzierten mesh...

Das Problem was ihr dort beschreibt, läst sich aber auch sehr einfach mittels Templates lösen.

mfg

Maverick

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

19.04.2003, 12:11

Richtig, die Shader kannst Du aber nur für's Rendern verwenden. Wenn die Anwendung selbst die transformierten Vertizes benötigt, dann muss das ja schon per Software geschehen!
Wenn man keinen Vertex-Shader verwendet, könnte man hier schon mit 3DNow! einiges an Speed rausholen.
Aber falls man doch Vertex-Shader benutzt, dann wäre das wohl ziemlich komplex, den auch noch zu emulieren. Dann gibt es ja noch die Methode IDirect3DDevice9::ProcessVertices. Die arbeitet zwar auch nicht mit der Hardware, aber egal, dann muss man sich nicht selbst um die Emulation von Vertex-Shadern kümmern.
In meinem Spiel verwende ich für die Kollisionserkennung auch stark reduzierte Meshes, die auch noch mit einem Octree eingeteilt sind.

7

19.04.2003, 13:28

Die beiden Funktionen waren ja nur Beispiele. Was anderes ist mir um diese Uhrzeit nicht mehr eingefallen :rolleyes:

Du sprichst da die Template Meta Programmierung an. Stehen unter anderem ein paar Beispiele in Spieleprogramierung Gems 1. Es ist natürlich unheimlich Praktisch einen Teil der Arbeit dem Compiler Aufzuhalsen ;)

Was den Intel Compiler angeht. Den hatte ich mir mal Installiert. Danach ging nix mehr bei mir. Nicht einmal die Projekte konnt ich mehr laden :( Danach war ich froh das ich den Compiler wirder sauber Deinstallieren konnte, ohne VC .NET neu Installieren zu müssen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige