Flame aus "Projekte": C oder C++ schneller bei Spieleprogrammierung?
-
MaSTaH schrieb:
Manuelh87: Deine ganzen Posts lassen doch auch darauf schließen, dass du wenig fundiertes Wissen über C++ besitzt. Gerade solche Sachen, die u.a. im Bereich der Spieleprogrammierung auftauchen, wie Matrizen kann man doch in C++ verdammt performant mit einem Klassentemplate implementieren und hat auch noch den Vorteil einer hohen Wiederverwendbarkeit.
Und das hab ich in C als typedef ned? Das musst jetzt aber erklären.
Was gibts viel fundiertes Wissen über c++? Na soviel gibts ja da ned, sorry aber ich find c++ ist ned allzu kompliziert. Mir daugt halt mehr cpu näheres coden und nicht so highlevel. deshalb find ich z.b. casts von long* auf void* blöde!
Kannst bitte ein Beispiel für das fehlende fundierte Wissen geben? da bin ich dann auch gepannt drauf. Ich hab jetzt echt schon erklärt warum ich auch c code und weiß ned warums ihr euch so angegriffen fühlts.
-
DEvent schrieb:
Manuelh87 schrieb:
DEvent schrieb:
Manuelh87 schrieb:
Nur z.b. ne Klasse für nen Vector würd ich wahrscheinlich ned machen.
ich bezweifle irgendwie, dass es irgendeinen geschwindigkeitsvorteil bringt, statt einer vector-klasse ein typedef struct zu machen.
( ich nehme an, du meinst einen mathematischen vektor und kein array )ne net deshalb sondern wegen weniger Konstruktor Destruktor und so und operatoren nicht zu vergessen
!
das war jetzt spass oder ?
class Vector { public: float x, y; }; typedef struct VectorS { float x, y; } VectorS; Vector v1; v1.x = 5; v1.y = 5; VectorS vs1; vs1.x = 5; v1s.y = 5;
was ist bitte schneller ?
und einen copy-ctor hast du bestimmt nicht in einer schleife die 1.000.000 wiederholt wird.
und seit wann machen operatoren den zugriff auf die elemene einer klasse langsamer ?edit: hm da war einer schneller...
du hast keine ahnung von klassen, oder? Und ebensowenig von operatoren, oder?
ps: jemand der eine Klasse wie eine structur anlegt hat das mit klassen ned verstanden! Dafür gibts ja 2 verschiedene Keywords!
Notfalls MSDN fragen!
-
Manuelh87 schrieb:
Was gibts viel fundiertes Wissen über c++? Na soviel gibts ja da ned, sorry aber ich find c++ ist ned allzu kompliziert. Mir daugt halt mehr cpu näheres coden und nicht so highlevel. deshalb find ich z.b. casts von long* auf void* blöde!
Manuelh87 schrieb:
Kannst bitte ein Beispiel für das fehlende fundierte Wissen geben? da bin ich dann auch gepannt drauf. Ich hab jetzt echt schon erklärt warum ich auch c code und weiß ned warums ihr euch so angegriffen fühlts.
Hab oben ein kleines Beispiel reineditiert...
-
nun bin ich mir ganz sicher! du hast von C++ nicht den leisesten hauch einer ahnung.
Matrix<float,4,4> m;
das erstellt dir eine 4x4 matrix auf floats basierend, von der geschwindigkeit her aber auch genausoschnell wie eine struct die eine 4x4 matrix mit floats darstellt. in allen belangen!
ps: jemand der eine Klasse wie eine structur anlegt hat das mit klassen ned verstanden! Dafür gibts ja 2 verschiedene Keywords!
zwischen struct und class gibt es in C++ nur einen unterschied: in structs ist alles default public und in class default private. mehr unterschiede gibts in c++ nicht zwischen class und struct. wenn man keine private elemente braucht, dann benutzt man structs, sonst class.
nur um mal sicher zu gehen: weist du, was expression templates oder die "template meta programmierung" bedeuten?
weist du was abstrakte fabriken sind?
weist du,was template template parameter sind?
policies?
functoren?
unterschied statische/dynamische polimorphie?
-
MaSTaH schrieb:
Manuelh87: Deine ganzen Posts lassen doch auch darauf schließen, dass du wenig fundiertes Wissen über C++ besitzt. Gerade solche Sachen, die u.a. im Bereich der Spieleprogrammierung auftauchen, wie Matrizen kann man doch in C++ verdammt performant mit einem Klassentemplate implementieren und hat auch noch den Vorteil einer hohen Wiederverwendbarkeit.
Kleines Beispiel:
template<std::size_t N, std::size_t M, typename T = float> class Matrix { T matrix[N][M]; //... usw. } template<std::size_t X, std::size_t N, std::size_t M, typename T> Matrix<N, M, T> operator*(const Matrix<N, X, T>& a, const Matrix<X, M, T>& b) { // ... } typedef Matrix<3, 1> Vector3; // Anwendung Matrix<3, 3> m; Vector3 v1, v2; // ... v2 = m * v1;
Der Compiler kann nun, wenn er es für sinnvoll hält, Schleifen auflösen und inlinen... Will man etwas vergleichbares in C machen, dann sieht der Code meist häßlich aus.
Ich hab am anfang auch solch code geschrieben bis ich draufgekommen bin wie oft der compiler den Konstruktor aufruft (und ned immer inlined wie ihr mir dauernt erklärt) und das hat ma halt ned daugt. ich mag da lieber 2 simple structs oder so denn wann brauch ich beim Spieleprogrammieren schon andere Matrizen als 3x3 und 4x4 ?
Ich versteh schon das euch so n code daugt aber ich hab eben meine gründe warm ich da lieber structs nehm. Ich hab da kein problem mit übersichtlichkeit da ich viel für den Ti code und bei dem gibts nur C und mitlerweile ist das für mich in Ordnung.
Mir ist scho klar wie man das mit Klassen umsetzt! Gegen aller andrer Meinung bin ich ned so kurz erst dabei! Nur sofern die lesbarkeit inerhalb des Projektteiles nicht leidet verwend ich eben seit einiger zeit andere techniken und die sind meines erachtens sehr simpel und produktiv.
-
Wo liegt den der Geschwindigkeitsnachteil hier?
Welche Konstruktoren werden unnötig aufgerufen?
Weißt du was Templates sind?
-
Manuelh87 schrieb:
du hast keine ahnung von klassen, oder? Und ebensowenig von operatoren, oder?
Eigentlich hast DU uns schon mehr als genug Unwissenheit bewiesen. Vielleicht solltest du dir mal die Release Builds der ASM-Listings anschaun anstatt der Debug Builds.
Manuelh87 schrieb:
ps: jemand der eine Klasse wie eine structur anlegt hat das mit klassen ned verstanden! Dafür gibts ja 2 verschiedene Keywords!
Notfalls MSDN fragen!
MSDN != Standard
Manuelh87 schrieb:
Ich hab am anfang auch solch code geschrieben bis ich draufgekommen bin wie oft der compiler den Konstruktor aufruft (und ned immer inlined wie ihr mir dauernt erklärt) und das hat ma halt ned daugt.
Das ändert aber nichts an der eigentlichen Tatsache, sondern ist ein Ausdruck von fehlender Compiler Optimierung.
-
Ich hab am anfang auch solch code geschrieben bis ich draufgekommen bin wie oft der compiler den Konstruktor aufruft (und ned immer inlined wie ihr mir dauernt erklärt) und das hat ma halt ned daugt.
wie hast du das denn getestet?
-
otze schrieb:
nun bin ich mir ganz sicher! du hast von C++ nicht den leisesten hauch einer ahnung.
Matrix<float,4,4> m;
das erstellt dir eine 4x4 matrix auf floats basierend, von der geschwindigkeit her aber auch genausoschnell wie eine struct die eine 4x4 matrix mit floats darstellt. in allen belangen!
ps: jemand der eine Klasse wie eine structur anlegt hat das mit klassen ned verstanden! Dafür gibts ja 2 verschiedene Keywords!
zwischen struct und class gibt es in C++ nur einen unterschied: in structs ist alles default public und in class default private. mehr unterschiede gibts in c++ nicht zwischen class und struct. wenn man keine private elemente braucht, dann benutzt man structs, sonst class.
nur um mal sicher zu gehen: weist du, was expression templates oder die "template meta programmierung" bedeuten?
weist du was abstrakte fabriken sind?
weist du,was template template parameter sind?
policies?
functoren?
unterschied statische/dynamische polimorphie?Natürlich ist die 4x4 Matrix genausoschnell weil sie ja vom compiler genau auf das umgeformt wird was ich verdammt nochmal benutze. aber class verwendet man trotzdem ned für so was und in struct verwende ich keine Funktionen weil das ned mit c compatibel ist und ich das scheiße fände. da gehört standart rein und der ist verflucht wichtig.
Und so ein code mit class hat absolut keinen stil in meinen augen.
(Nur weil in Javascript bei der letzten zeile code keine semicolone stehen muss [und der kompiler es trotzdem checkt] heißt das ned das keine hinkört.Und da mit haufenweise fachwörter umsich zu schmeißen bringt galub ich auch ned das ware...
aber ich schätz mal ich muss das jetzt unter beweis stellen:
Also:
abstrakte fabriken sind:
Muss ich das ganze System erklären oder reicht defintion. Factory hat ne vorlage (abstrakte classe) ist ein singletone und kann dann weiterverwendet werden von einem sog. client.templates und t.. parameter haben wir eh vorher gehabt, wird zuerst aufgelöst und dann übersetzt .........
policies ja templates im einsatz (weiß ned warum das nen eigenen namen hat, wahrscheinlich damit so poser wie du damit umsich werfen können)
Templates kann man natürlich vielseitig einsetztenfunctoren wieder ein unnötiger neuer name für etwas das es gibt und schon immer gab: eine struktur zum speichern von daten (wieder ideal zum auswendig lernen)
statische/dynamische polimorphie eines meiner favourites: Ich habs allerdings ned so gennant und zugegebn nachschauen müssen:
Ein neuer toller Poserbegriff für überladen "statisch" und virtuell dynamisch.
unterschied ist: statisch löst der kompiler auf beim kompilieren.
Virtuelle funktionen die "überschrieben werden" da wir sozusagen einfach dynamisch ne adresse eingetragen. Wird aber meines wissens auch vom compiler beim übersetzen aufgelöst.Da hab ich aber eh gsagt das ich die bei ctoken... verwendet hab... also wieder mal ne bescheuerte kritik....
Muss ich mich noch weiter rechtfertigen.. oder is damit getan?
Manuelh87(pissed off)
-
Manuelh87 schrieb:
Weil ich ne Matrix als typedef struct anlegen würd? das ist auch staark ne Stilfrage und ich find dass das nur Daten sind und da keine Klasse hingehört. Und wenn der restliche code dadurch nicht zu stark aufgebläht wird dann würd ich das auf jeden fall als typedef struct anlegen.
Eine Matrix sind nicht nur Daten, wie du merken wirst, wenn du dann Methoden ala matrix_invers und co implementieren wirst. Ob man die nun in eine Klasse packt oder nichts ändert gar nichts, an Geschwindigkeit oder Größe des Codes. Bei mir erzeugt folgender C++ Code sogar ein kleineres Binary, als die entsprechende C Variante
//C++ class matrix_2x2 { int m0_,n0_; int m1_,n1_; public: matrix_2x2(int m0,int n0,int m1,int n1) : m0_(m0),n0_(n0),m1_(m1),n1_(n1) { } int m0() const { return m0_; } int m1() const { return m1_; } int n0() const { return n0_; } int n1() const { return n1_; } void m0(int m) { m0_=m; } void m1(int m) { m1_=m; } void n0(int n) { n0_=n; } void n1(int n) { n1_=n; } matrix_2x2 &operator+=(matrix_2x2 const &o) { m0_+=o.m0_; m1_+=o.m1_; n0_+=o.m0_; n1_+=o.n1_; } }; int main() { matrix_2x2 a(10,10,5,5); matrix_2x2 b(5,5,10,10); b+=a; } //C typedef struct { int m0,n0; int m1,n1; } matrix_2x2; void matrix_2x2_add(matrix_2x2 *a,matrix_2x2 b) { a->m0+=b.m0; a->m1+=b.m1; a->n0+=b.n0; a->n1+=b.n1; } int main() { matrix_2x2 a={ 10,10,5,5 }; matrix_2x2 b={ 5,5,10,10 }; matrix_2x2_add(&b,a); }
> gcc -Os -s cpp_vs_c.c -o cpp_vs_c-c > ls -l cpp_vs_c-c ... 2952 ... > gcc -Os -s cpp_vs_c.cpp -o cpp_vs_c-cpp > ls -l cpp_vs_c-cpp ... 2840 ... > gcc -v ... gcc-Version 3.4.2 (Debian 3.4.2-2)
Siehst du, ob du eine Klasse benutzt oder nicht ist absolut unwichtig.
Aber erklär mir jetzt bitte von was genau ich keine Ahnung hab und wie das alles wirklich ist.
genug erklärt warum du keine Ahnung hast?
Ich hab am anfang auch solch code geschrieben bis ich draufgekommen bin wie oft der compiler den Konstruktor aufruft
Naja, ich muss dir recht geben, dass in C++ nicht sofort ansehbar ist, was wie viel kostet.
-
otze schrieb:
Ich hab am anfang auch solch code geschrieben bis ich draufgekommen bin wie oft der compiler den Konstruktor aufruft (und ned immer inlined wie ihr mir dauernt erklärt) und das hat ma halt ned daugt.
wie hast du das denn getestet?
nicht blöde fragen stellen sonder gehirn einschalten! na wie wird ma das testen....
-
Geh weiter spielen...
-
kingruedi schrieb:
Manuelh87 schrieb:
Weil ich ne Matrix als typedef struct anlegen würd? das ist auch staark ne Stilfrage und ich find dass das nur Daten sind und da keine Klasse hingehört. Und wenn der restliche code dadurch nicht zu stark aufgebläht wird dann würd ich das auf jeden fall als typedef struct anlegen.
Eine Matrix sind nicht nur Daten, wie du merken wirst, wenn du dann Methoden ala matrix_invers und co implementieren wirst. Ob man die nun in eine Klasse packt oder nichts ändert gar nichts, an Geschwindigkeit oder Größe des Codes. Bei mir erzeugt folgender C++ Code sogar ein kleineres Binary, als die entsprechende C Variante
//C++ class matrix_2x2 { int m0_,n0_; int m1_,n1_; public: matrix_2x2(int m0,int n0,int m1,int n1) : m0_(m0),n0_(n0),m1_(m1),n1_(n1) { } int m0() const { return m0_; } int m1() const { return m1_; } int n0() const { return n0_; } int n1() const { return n1_; } void m0(int m) { m0_=m; } void m1(int m) { m1_=m; } void n0(int n) { n0_=n; } void n1(int n) { n1_=n; } matrix_2x2 &operator+=(matrix_2x2 const &o) { m0_+=o.m0_; m1_+=o.m1_; n0_+=o.m0_; n1_+=o.n1_; } }; int main() { matrix_2x2 a(10,10,5,5); matrix_2x2 b(5,5,10,10); b+=a; } //C typedef struct { int m0,n0; int m1,n1; } matrix_2x2; void matrix_2x2_add(matrix_2x2 *a,matrix_2x2 b) { a->m0+=b.m0; a->m1+=b.m1; a->n0+=b.n0; a->n1+=b.n1; } int main() { matrix_2x2 a={ 10,10,5,5 }; matrix_2x2 b={ 5,5,10,10 }; matrix_2x2_add(&b,a); }
> gcc -Os -s cpp_vs_c.c -o cpp_vs_c-c > ls -l cpp_vs_c-c ... 2952 ... > gcc -Os -s cpp_vs_c.cpp -o cpp_vs_c-cpp > ls -l cpp_vs_c-cpp ... 2840 ... > gcc -v ... gcc-Version 3.4.2 (Debian 3.4.2-2)
Siehst du, ob du eine Klasse benutzt oder nicht ist absolut unwichtig.
Aber erklär mir jetzt bitte von was genau ich keine Ahnung hab und wie das alles wirklich ist.
genug erklärt warum du keine Ahnung hast?
Ich hab am anfang auch solch code geschrieben bis ich draufgekommen bin wie oft der compiler den Konstruktor aufruft
.
also bei mir hats 1.484 Bytes
Aber wir können gern weiterdiskutieren wer wo keine Ahnung hat und warum
Naja, ich muss dir recht geben, dass in C++ nicht sofort ansehbar ist, was wie viel kostet
-
MaSTaH schrieb:
Geh weiter spielen...
Qué?
-
Manuelh87 == Spieleprogrammierer
-
Vermutung schrieb:
Manuelh87 == Spieleprogrammierer
Fühl mich gehrt aber das ist wahrscheinlich der bereich wo ich wirklich kaum ahnung hab
! Aber danke ich fasse das nämlich als hohes lob auf...
Ich will ja was machen, aber alleine ists halt ned allzu lustig, deshalb hab ich ja den eigentlichen thread gestartet!
Aber bis jetzt hat sich da noch keiner gemeldet... :xmas1:
mfg Manuelh87
-
Manuelh87 schrieb:
Vermutung schrieb:
Manuelh87 == Spieleprogrammierer
Fühl mich gehrt aber das ist wahrscheinlich der bereich wo ich wirklich kaum ahnung hab
! Aber danke ich fasse das nämlich als hohes lob auf...
-
also bei mir hats 1.484 Bytes
Was? Und was willst du mir damit sagen?
und bitte benutze nicht immer full-Quote!
-
@manuel
wieso sagst du immer den gleichen sch...? ich meine du sagst A, dann zeigt man dir, dass A falsch ist und du sagst dann trotzdem A! entweder verstehst du es einfach nicht, oder du überschätzt deine fähigkeiten... lerne einfach daraus!Und ein vektor gehört einfach in eine klasse, da es ein typ ist auf dem bestimmte operationen definiert sind (z.b. verschiebungen, drehungen)! zudem sollte man alle attribute private machen, damit die struktur nicht offengelegt wird! denn wer sagt, dass ein vektor aus den x-y koordinaten bestehen muss? ein vektor identifiziert einen punkt im Vektorraum. und da gibt es auch andere darstellungsmöglichkeiten (z.b. polarkoordinaten).
denn was ist wenn du feststellst in deinem programm, dass du viele vektoren rotieren musst und du aber einen vektor mit x-y koordinaten gewählt hast? es wäre doch viel sinnvoller gewesen einen vektor mit polarkoordinaten dafür zu nehmen, da dort rotationen einfach zu realisieren sind! nun musst du deinen kompletten programmcode umändern. hättest auf schnittstellen programmiert, wäre diese änderung ganz einfach gewesen....Gruß mathik
-
rapso schrieb:
mathik schrieb:
rapso schrieb:
und naja, alles auf einen compiler zu schieben find ich suboptimal, denn ein wirklich guter compiler würde meiner meinung nach erkennen, dass ich nen bubblesort implementiert habe und ihn durch nen quicksort ersetzen.
das sind genau solche sachen, die ein compiler niemals optimieren können wird!
was ein compiler können wird hängt von dessen programmierern ab, ...
das ist nicht richtig! es gibt probleme, die wird ein computer niemals lösen können! das ist mathematisch bewiesen!
Gruß mathik