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

1

30.05.2011, 17:34

[Tip]Beschleunigtes dividieren für einen Softwarerenderer

Nabend allerseits.
Hatte ja schonmal hier gefragt(wenn ich mich recht erinnere) wie ich meine Interpolationen etc in meinem softwarerenderer optimieren könnte.

Bei uns im Delphi forum habe ich gerade den rettenden tip bekommen. er ist zwar für Delphi, sollte aber auch in C++ umsetzbar sein.

Der trick war es zu vermeiden zwischen float/int wechseln zu müssen, sowie ständig zu dividieren.

Durch den tip den ich bekommen hab, ist es mir nun gelungen die fps von ca 28-30 fps bei 512*512px (1.5ghz) auf 52fps zu pushen(gouradshading).

Expliziter Post:
Post #52

Topic:
HauptPost

In meiner genauen problemstellung, ärgerte mich halt die Kalkulation der Farbwerte für das gouradshading.
Ich dachte dass diese Lösung vllt noch jemanden interressiert :)

EDIT: Diese Methode ist auf meinem P4 übrigens 4 mal schneller als die im einganspost geschriebene methode im verlinkten Hauptpost.

MFG
Memnarch
Meine Website mit Updates/News zu Aktuellen Projekten:SpareTime-Development

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

30.05.2011, 17:44

Wenn ich das richtig verstehe willt das Posting uns sagen dass es schneller ist mit dem Kehrwert zu multiplizieren anstatt eine Division auszuführen, was wohl für kaum jemanden eine Neuigkeit sein sollte!? Warum da asm notwendig ist, ist mir schleierhaft.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

30.05.2011, 17:47

Na ja, er nimmt ja nur das höhere Register des Ergebnisses, die unteren 32 Bit knickt er gleich weg (EAX). Will mal sehen, wie man das mit reinem Delphi machen will.
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

4

30.05.2011, 17:50

Gut ok, vielleicht liegt das an Delphi. Ich mein nur, prinzipiell könnte man genausogut einfach mit float arbeiten...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

30.05.2011, 17:54

Selbst in C++ sehe ich da jetzt keinen guten Weg nur das Ergebnis aus EDX zu verwenden statt den aus dem Paar EDX:EAX.
Aber ja, float ginge sicher auch, ist vermutlich aber doch 'nen ganzen Tick langsamer.
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

6

30.05.2011, 17:55

Aber ja, float ginge sicher auch, ist vermutlich aber doch 'nen ganzen Tick langsamer.

Glaub ich eben nicht. Floating-Point sollte auf einer halbwegs aktuellen CPU nicht wirklich langsamer sein als Integer-Arithmetik. Die Instruction Latencies waren jedenfalls noch gleich als ich das letzte Mal nachgeschaut hab, d.h. Unterschiede kommen wenn dann vielleicht von der Möglichkeit zur out of order Execution. Und wenn man bei einem Softwarerenderer optimale Performance will is sowieso SSE und Multitthreading angesagt...

Interessant wär jetzt wieviel schneller der neue Code ist als einfach

Quellcode

1
2
3
4
nrm := 1 div Wert;
Ergebnis := (A*x + B*Y + C*Z) * nrm;
Ergebnis2 := (A*x2 + B*Y2 + C*Z2) * nrm;
Ergebnis3 := (A*x3 + B*Y3 + C*Z3) * nrm;

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (30.05.2011, 18:14)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

30.05.2011, 18:01

Jo, SSE holt was raus. Aber Multithreading ist ja für beide Varianten identisch, ob nun FPU oder CPU, das nimmt sich ja nix.
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

8

30.05.2011, 18:08

Ja, aber sobald du SSE benutzt dann macht float vs. int ganz sicher keinen wirklichen Geschwindigkeitsunterschied mehr und Multithreading bringt halt anderwertig noch massiv Speedup...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (30.05.2011, 18:15)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

30.05.2011, 18:25

Das habe ich auch nicht bestritten ;)
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

10

30.05.2011, 19:07

Sag ich ja auch nicht. Egal ;)

Interessant wär jetzt wieviel schneller der neue Code ist als einfach

Quellcode

1
2
3
4
nrm := 1 div Wert;
Ergebnis := (A*x + B*Y + C*Z) * nrm;
Ergebnis2 := (A*x2 + B*Y2 + C*Z2) * nrm;
Ergebnis3 := (A*x3 + B*Y3 + C*Z3) * nrm;

Werbeanzeige