JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=e258df810810183e90fab63d0489cf4bMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Perspective-Matrix so dass ichs kapieren kann
Gehe zu Seite Zurück  1, 2, 3  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 22.04.2005, 19:40    Titel: Antworten mit Zitat

np.

Bei Fragen fragen Wink
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
HomeLess_PunkDrummer
JLI Master Trainee


Alter: 36
Anmeldedatum: 28.11.2004
Beiträge: 583
Wohnort: Alter Joghurtbecher an der A4
Medaillen: Keine

BeitragVerfasst am: 23.04.2005, 18:22    Titel: Antworten mit Zitat

Ich saug sie mir net, weil ich selbst coden will Very Happy
Ob ich die Matrizenfunktionen von D3DX nehm oder deine is doch sonst ähnlich Very Happy
Obwohl ich aus Sympathiegründen (Gruß Microsoft) dann im Notfall doch dich fragen würde Smile
_________________
"Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 23.04.2005, 19:52    Titel: Antworten mit Zitat

Sag das net mit der Ähnlichkeit Wink meine basieren nur auf Templates Wink
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
HomeLess_PunkDrummer
JLI Master Trainee


Alter: 36
Anmeldedatum: 28.11.2004
Beiträge: 583
Wohnort: Alter Joghurtbecher an der A4
Medaillen: Keine

BeitragVerfasst am: 24.04.2005, 14:51    Titel: Antworten mit Zitat

Mist, ich wusste das das kommt Smile
Aaaalso was ich meinte war wenn ich was fremdes nehme ist es doch egal was, Hauptsache ist es geht Smile Ich will aber mein eigenes Zeug benutzen, denn wenn ich deine Mathelib implementiere lern ich doch auch nichts außer Funktionsaufrufen Smile

Jaja, und wie man Templates aufruft Wink
_________________
"Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 24.04.2005, 19:22    Titel: Antworten mit Zitat

jop, ich mahce es genau wie Homyboy Wink
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 24.04.2005, 19:42    Titel: Antworten mit Zitat

hach, ein HOCH auf Templates Very Happy

hab mir auch mal meine Eigenen( Exclamation ), nur auf Templates basierenden, Mathe-Funktionen geschrieben. Ein Auszug(achja, Patrick, ich bitte um deine Meinung Very Happy )

Fibonacci-Zahlen:
CPP:
 template< unsigned N > struct Fib
{
     enum
     {
          // Rekursive Definition:
          Val = Fib< N-1 >::Val + Fib< N-2 >::Val
     };
};

// Spezialisierungen für die Fälle 0 und 1 (Abbruchkriterien)
template <> struct Fib< 0 > { enum { Val = 0 }; };
template <> struct Fib< 1 > { enum { Val = 1 }; };

// Das Template wie eine Funktion aussehen lassen:
#define FibT( n ) Fib< n >::Val


Fakultät:
CPP:
// Templatisierte Fakultät
template< unsigned N > struct Fak
{
     enum { Val = N * Fak< N-1 >::Val };
};

// Spezialisierte für Grundfall
template <> struct Fak< 1 > { enum { Val = 1 }; };

// Template wie einfe Funktion aussehen lassen
#define Fak( n ) Fak< n >::Val


Sinus:
CPP:
template< double R > struct Sinus
{
     enum { MaxTerms = 10 }; // Erhöhen für mehr Genauigkeit
     static inline double sin()
     {
          return R * Term< R, 0, MaxTerms >::val();
     }
};

template< double R, int I, int MaxTerms > struct Term
{
     enum
     {
          // Continue ist true, bis wir M Terme ausgewerte haben
          Continue = I + 1 != MaxTerms,
          NxtI = ( I + 1 ) * Continue,
          NxtMaxTerms = MaxTerms * Continue
     };

     // Rekursive Definitionen, einmal pro Term aufzurufen
     static inline double val()
     {
          return 1 - R * R / ( 2.0 * I + 2.0 ) / ( 2.0 * I + 3.0 ) * Term< R * Continue, NxtI, NxtMaxTerms >::val();
     }
};

// Spezialisierung, um die Schleife zu terminieren
template <> sruct Term< 0.0, 0, 0 >
{
     static inline double val() { return 1.0; }
};

// Template wie eine Funktion aussehen lassen
#define SinusT( r ) Sinus< r >::sin()


ich hab auch noch ne volle Matrizen-Berechnung(natürlich Template-Metaprogramming) will die jetzt aber nicht hier zeigen, wäre zuviel Wink

Wer die aber haben will, dem kann ich die zeigen

Gruß DirectXer

edit: hey, struct is im C++-Highlight gar kein Schlüsselwort Rolling Eyes


Zuletzt bearbeitet von DirectXer am 24.04.2005, 20:48, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
xardias
JLI Master


Alter: 39
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 24.04.2005, 20:42    Titel: Antworten mit Zitat

hör mir auf mit fibonacci...
wir haben in mathe mit vektorräumen bewiesen, dass man fibonacci folgen auch nicht-rekursiv berechnen kann.. *nerv*
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 24.04.2005, 20:49    Titel: Antworten mit Zitat

stimmt, Fibonacci is scheiße, wieso gibts das überhaupt? Brauch eh kein Mensch, aber in ner Math-Library darfs net fehlen Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 24.04.2005, 20:50    Titel: Antworten mit Zitat

was extrem viel schneller und kaum kkomplizeirter ist.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 24.04.2005, 21:15    Titel: Antworten mit Zitat

DirectXer
Soso Du hast Dich also mit der Template-Metaprogrammierung auseinander gesetzt Wink Anfürsich ganz gut... ABER:

Metaprogrammierung hat einen Nachteil: Fehlende Dynamik.

Da Du alles nur zur Compilierzeit errechnen kannst, kannst Du es nicht mehr zur Laufzeit errechnen Wink Deshalb wäre Deine Sinus-Funktion für ein 3D Spiel nicht zu gebrauchen.
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 25.04.2005, 18:59    Titel: Antworten mit Zitat

@Patrick hast Recht:
geiles Programmierbuch hat Folgendes geschrieben:

Es gibt ein potenzielles Problem mit Template-Metaprogrammierung. Viele der heute erhältlichen Compiler (ca.2000) können die Rekrusion und die Mathematik, die mit komplexen templatebasierenden Algorithmen einhergehen, nicht reduzieren.


d.h.: In meinem Sinus-Bsp. mit 10 Thermen muss der Compiler etwa 20 Fließkomma-Multiplikationen, 50 Integer-Multiplikationen, 20 Fließkomma-Divisionen, 10 Fließkomma-Subtraktionen und 10 rekursive Aufrufe auf ein bis zwei Instruktionen reduzieren.

danach, geiles Buch hat Folgendes geschrieben:

Könnte ein Compiler das tun? Na klar. Sollte ein Compiler das tun? Vielleicht, wenn man ihm genügend Ressourcen(RAM uns Zeit) bereitstellt. Wird ein Compiler das tun? Kommt darauf an.


So hab ich also alle(auch die Matrizen-Berechnungen) mit und ohne Temp-Meta mit VC++ 6.0 getestet. Es erledigte die Arbeit glänzend mid den Fib- und Fakultäts-Templates und produzierte jeweils eine eigene MOV-Instruktion. Es gab mehr Probleme mit meinem Sinus-Template und generierte schlechteren Code als die Laufzeitfunktion sin() von C! VC6 war imstande, die Rekursion bis Level 8 zu bewältigen, und es optimierte die Arithmetik kaum. Dann hab ich die VC6-spezifischen #pragmas inline_depth(255) und inline_recursion(on) verwendet und VC6 konnte die Rekursion komplett auflösen und alle Mathematik wegoptimieren: gute Ergebnisse sind also glücklicherweise immer noch möglich Very Happy

Aber, um noch bessere Ergebnisse zu erhalten, hab ich die Rekursion entfernt und meine Reihe ist inline auf 10 Thermen. Also: 12 Multiplikationen, 21 Divisionen und 10 Subtraktionen. die Template-Spezialisierung ist ´nun auch net mehr nötig Wink :
CPP:
template < double R > struct Sinus
{
     // Alle Werte zur Compilerzeit bekannt. Ein flotter Compiler sollte das
     // auf eine einzige konstante Zeit reduzieren können
     static inline double sin()
     {
          double Rsqr = R * R;
          return R * ( 1.0 - Rsqr / 2.0 / 3.0
                       * ( 1.0 - Rsqr / 4.0 / 5.0
                       * ( 1.0 - Rsqr / 6.0 / 7.0
                       * ( 1.0 - Rsqr / 8.0 / 9.0
                       * ( 1.0 - Rsqr / 10.0 / 11.0
                       * ( 1.0 - Rsqr / 12.0 / 13.0
                       * ( 1.0 - Rsqr / 14.0 / 15.0
                       * ( 1.0 - Rsqr / 16.0 / 17.0
                       * ( 1.0 - Rsqr / 18.0 / 19.0
                       * ( 1.0 - Rsqr / 20.0 / 21.0
                       ) ) ) ) ) ) ) ) ) );
     }
};

// Template wie eine Funktion aussehen lassen
#define SinusT( r ) Sinus< r >::sin()


Lange Rede, kurzer Sinn: Template-Metaprogrammierung kann massive Geschwindigkeitsvorteile bringen - manchmal, aber nicht immer.



So, und jetzt nur noch zu meinen Matrizen-Berechnungen. Diese hab ich auch mit und ohne Templates getestet, und bin zu dem Resultat gekommen:

    Operation ohne Templ. mit Templ. war Compiler imstande?
    (Millisek.) (Millisek,)

    matrix33::zero 33.992 29,330 Vollständig
    matrix44::zero 36,036 30,292 Vallständig
    matrix33::identity 45,827 29,526 Vollständig
    matrix44::identity 46,845 29,905 Vollständig
    matrix33::transpose 35,338 29,995 Vollständig
    matrix44::transpose 90,638 30,245 Teilweise
    matrix33:Surprisedp *= 62,904 50,352 Teilweise
    matrix44:Surprisedp *= 326,890 792,901 Teilweise


Außer der 4x4 Matrix-Multiplikation waren die templatisierte Versionen alle merklich schneller Wink

Gruß DirectXer, der gerade seinen längsten Beitrag in diesem Forum geschrieben hat Rolling Eyes

PS:Also, wer die Funktionen sehen will, nur fragen Very Happy

EDIT: mist, in meiner Liste hat der die Leerzeichen weggemacht Sad ; und mein Operator in der List "*=" hat er durch Surprised ersetzt


Zuletzt bearbeitet von DirectXer am 25.04.2005, 19:08, insgesamt 3-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 25.04.2005, 19:06    Titel: Antworten mit Zitat

DirectXer
Ich glaube Du verstehst nicht! Probier mal einen Wert per cin einzugeben, und diese Variable dann an Deine Meta-Templatefunktion zu übergeben (z.B. fib).

Es wird nicht klappen! Da Metas nur zur Compilierzeit ausgeführt werden und nicht zur Laufzeit! Daher ergibt sich im Releasemode auch dieser enorme Performanceunterschied.
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 25.04.2005, 19:14    Titel: Antworten mit Zitat

ich werde auch keinen Wert per cin während der Laufzeit eingeben Wink *g*

was hälste denn von meiner einfachen Lösung( Laughing )
CPP:
double Sinus( double dWinkel )
{
     const int iMaxTerms = 10;
     return dWinkel * Term( dWinkel, 0, iMaxTerms );
}

double Term( double dWinkel, int i, int iMaxTerms )
{
     if( i > iMaxTerms)
          return 1.0;

     return 1.0 - ( dWinkel * dWinkel / ( 2.0 * i + 2.0) / ( 2.0 * i + 3.0 ) *                     Term( dWinkel, i + 1, iMaxTerms ) );´
}


Zuletzt bearbeitet von DirectXer am 25.04.2005, 19:19, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 25.04.2005, 19:17    Titel: Antworten mit Zitat

Nicht viel, ich halte mehr von dieser Wink

CPP:
template<typename T> inline const T sin (const T& value)
{ return (static_cast<T>(::std::sin(value))); }
template<> inline const float sin (const float& value)
{
        // Hilfsvariable deklarieren und wert übergeben
    static float result = 0;
    result = value;

    __asm { finit           }; // FPU initialisieren
    __asm { fld     result  }; // Wert in das FPU Register schieben
    __asm { fsin            }; // FPU-Sinus durchführen
    __asm { fst     result  }; // Wert zurück in 'result' schieben

        // Fertig!
    return (result);
}


Wink
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 25.04.2005, 19:21    Titel: Antworten mit Zitat

Also: Es ist nicht alltäglich, dass man von exponetieller Laufzeit auf konstante Laufzeit runter kommst. Mit Template-Metaprogrammierung ist der Preis, den du zahlst, zusätzl. Kompilerzeit anstelle zusätzl. Ausführungszeit. Für Spiele ist die Ausführungszeit üblicherweise viel kritischer als die Kompilerzeit, daher is diese Technik sehr ansprechend.

BTW: meine obrigen Lösungen waren auch nur kleine Bsp. als ich auf Temps gekommen bin und viel ausprobiert hab. Ich find die einfach geil. Very Happy

Gruß DirectXer


Zuletzt bearbeitet von DirectXer am 25.04.2005, 19:24, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite Zurück  1, 2, 3  Weiter
Seite 2 von 3

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum