 |
JLI Spieleprogrammierung
|
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
|
|
Nach oben |
|
 |
HomeLess_PunkDrummer JLI Master Trainee

Alter: 36 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 23.04.2005, 18:22 Titel: |
|
|
Ich saug sie mir net, weil ich selbst coden will
Ob ich die Matrizenfunktionen von D3DX nehm oder deine is doch sonst ähnlich
Obwohl ich aus Sympathiegründen (Gruß Microsoft) dann im Notfall doch dich fragen würde  _________________ "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 |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
 |
HomeLess_PunkDrummer JLI Master Trainee

Alter: 36 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 24.04.2005, 14:51 Titel: |
|
|
Mist, ich wusste das das kommt
Aaaalso was ich meinte war wenn ich was fremdes nehme ist es doch egal was, Hauptsache ist es geht Ich will aber mein eigenes Zeug benutzen, denn wenn ich deine Mathelib implementiere lern ich doch auch nichts außer Funktionsaufrufen
Jaja, und wie man Templates aufruft  _________________ "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 |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 24.04.2005, 19:42 Titel: |
|
|
hach, ein HOCH auf Templates
hab mir auch mal meine Eigenen( ), nur auf Templates basierenden, Mathe-Funktionen geschrieben. Ein Auszug(achja, Patrick, ich bitte um deine Meinung )
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
Wer die aber haben will, dem kann ich die zeigen
Gruß DirectXer
edit: hey, struct is im C++-Highlight gar kein Schlüsselwort 
Zuletzt bearbeitet von DirectXer am 24.04.2005, 20:48, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
xardias JLI Master

Alter: 39 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 24.04.2005, 20:42 Titel: |
|
|
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 |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 24.04.2005, 20:49 Titel: |
|
|
stimmt, Fibonacci is scheiße, wieso gibts das überhaupt? Brauch eh kein Mensch, aber in ner Math-Library darfs net fehlen  |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 24.04.2005, 20:50 Titel: |
|
|
was extrem viel schneller und kaum kkomplizeirter ist. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 24.04.2005, 21:15 Titel: |
|
|
DirectXer
Soso Du hast Dich also mit der Template-Metaprogrammierung auseinander gesetzt 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 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 |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 25.04.2005, 18:59 Titel: |
|
|
@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
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 :
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: p *= 62,904 50,352 Teilweise
matrix44: p *= 326,890 792,901 Teilweise
Außer der 4x4 Matrix-Multiplikation waren die templatisierte Versionen alle merklich schneller
Gruß DirectXer, der gerade seinen längsten Beitrag in diesem Forum geschrieben hat
PS:Also, wer die Funktionen sehen will, nur fragen
EDIT: mist, in meiner Liste hat der die Leerzeichen weggemacht ; und mein Operator in der List "*=" hat er durch ersetzt
Zuletzt bearbeitet von DirectXer am 25.04.2005, 19:08, insgesamt 3-mal bearbeitet |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 25.04.2005, 19:06 Titel: |
|
|
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 |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 25.04.2005, 19:14 Titel: |
|
|
ich werde auch keinen Wert per cin während der Laufzeit eingeben *g*
was hälste denn von meiner einfachen Lösung( )
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 |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 25.04.2005, 19:17 Titel: |
|
|
Nicht viel, ich halte mehr von dieser
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);
} |
 _________________ '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 |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 25.04.2005, 19:21 Titel: |
|
|
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.
Gruß DirectXer
Zuletzt bearbeitet von DirectXer am 25.04.2005, 19:24, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
|
|
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
|