|
Community Links |
Interessengemeinschaften |
Benutzerliste |
Foren durchsuchen |
Stichwortsuche |
Erweiterte Suche |
Uns unterstützen |
Shoppen bei Amazon |
Spende per Patreon |
Spende per PayPal |
Spende per Steady |
alle Möglichkeiten |
Gehe zu... |
![]() |
|
Themen-Optionen
![]() |
Ansicht
![]() |
![]() |
#1 (im Thread / einzeln) |
Gold Member
|
![]()
Hi,
mich würde mal interessieren, auf was die Profis der Programmierung bei ihren Programmen bzw. Spielen alles beachten. Wenn es geht, dann speziell zu C/C++ und zu deren Funktionen ![]() Nutzt ihr viele Zeiger oder auch Pointer? Was ist besser, mehrere kurze Funktionen oder weniger längere? Sind globale Variablen sinnvoller im Gegensatz zu Zeigern? Was sollte man möglichst dynamisch programmierung und was statisch? Wo kann man besonders Speed sparen, da ich hauptsächlich mit OpenGL und C++ werke ![]() EDIT: Ach, und wie sieht`s speziell mit der Aufteilung in Dateien, also ob DLL, oder nicht DLL, viele Header Dateien etc. ??? ? MFG Einfachkrank
Über 5 Millionen Menschen hören HipHop. Schreib dich nicht ab! Lern Reden und Gehen :-D
www.michael-eberhardt.de Geändert von Einfachkrank (2002-12-05 um 16:32:37 Uhr) |
![]() |
![]() ![]() |
![]() |
#2 (im Thread / einzeln) |
Moderator & 3D-Guru
Registriert: 2001-08-19
Ort: Baden-Württemberg
Beiträge: 48.049
|
Hehe, das ist eine gute Frage. Man sollte folgende Sachen beachten:
grössere Datenmengen ständig hin und her zu kopieren ist nicht so gut. Und man sollte Schleifen so coden, daß diese möglichst wenige Durchläufe brauchen. Ansonsten kann man sich in den meisten Fällen auf den Compiler verlassen. Edit: Sinn.
"Der Akt, durch den ein Individuum seiner Güter beraubt wird, heisst Raub, wenn ihn ein anderes Individuum begeht. Und soziale Gerechtigkeit, wenn eine ganze Gruppe plündert" - Nicolas Gomez Davila
"Die perfekte Gleichheit liegt nur im Tod. Deshalb ist der Genozid die Lieblingsbeschäftigung der Gleichmacher." - Roland Baader "Es ist egal, ob die Wissenschaft der globalen Erwärmung komplett an den Haaren herbeigezogen ist, gibt uns der Klimawandel doch die größte Möglichkeit Gerechtigkeit und Gleichheit in die Welt zu tragen." Christine Stewart "Nimm das Recht weg – was ist dann ein Staat noch anderes als eine große Räuberbande" - Heiliger Augustinus "Socialists cry "Power to the people", and raise the clenched fist as they say it. We all know what they really mean—power over people, power to the State." - Margaret Thatcher Ich ziehe es vor, meine Kenntnisse aus den autorisierten Informationen unserer Regierung zu beziehen. - Klima"wissenschaft" in Action Geändert von Exxtreme (2002-12-05 um 17:46:36 Uhr) |
![]() ![]() |
![]() ![]() |
![]() |
#3 (im Thread / einzeln) |
3DCenter Crew & 3D-Guru
|
In erster Linie versuche ich mal so zu programmieren das ich den Code auch noch 1 Jahr später verstehe. Optimiert wird dann an den Flaschenhälsen.
Aber wie Exxtreme schon sagte erzuegen die Compiler inzwischen recht guten Code aber wenn man den falschen Ansatz zur Lösung eines Problems benutzt kann der Compiler auch nichts mehr retten. Wenn du jetzt noch die Grafikkarte ins spiel bringst gelten wieder ganz andere Regeln. Aber dazu gibt es zum Beispiel bei NVIDIA eine ganze menge gute Dokumente. |
![]() |
![]() ![]() |
![]() |
#4 (im Thread / einzeln) |
Gold Member
Threadstarter |
Meine GraKa
Originally posted by Demirug
Über 5 Millionen Menschen hören HipHop. Schreib dich nicht ab! Lern Reden und Gehen :-D
www.michael-eberhardt.de |
![]() |
![]() ![]() |
![]() |
#5 (im Thread / einzeln) |
3DCenter Crew & 3D-Guru
|
Re: Meine GraKa
Originally posted by Einfachkrank |
![]() |
![]() ![]() |
![]() |
#6 (im Thread / einzeln) |
Grandmaster Member
Registriert: 2002-03-10
Beiträge: 12.026
|
Originally posted by Exxtreme ![]() Eigentlich nicht. Kurze Schleifen, die nur ein, zweimal durchlaufen werden haben einen prozenutal viel zu hohen Overhead für die Schleifenlogik. Daher sind oft wiederholte Schleifen besser (es sei denn natürlich sie machen unnützen Kram, aber dann ist's eh egal ob oft oder nicht). Auch zu kleine Schleifenkörper haben dieses Problem, das löst man durch sogenanntes 'loop unrolling'. Dh daß man pro Durchlauf der Schleife mehrere logische Durchläufe ausführt. Wobei man dann wieder beachten muß, daß wenn man innerhalb der Schleife zB vier logische Iterationen ausführt, man die übriggebliebenen Iterationen zusätzlich außerhalb der Hauptschleife ausführen muß. *edit* Man kann halt nicht jede mögliche Anzahl an Schleifeniterationen glatt durch vier teilen. Clevere Compiler sollten eigentlich in der Lage sein das loop unrolling selbst zu erledigen. AMD gibt als vernünftigen Wert für Schleifenkörper ca 100 Maschineninstruktionen an. Größer ist tendenziell besser, verschwendet aber Platz im Code-Cache. Bei Streaming-Geschichten soll man pro Iteration 64Bytes an Daten verarbeiten, aber das lohnt nur zu wissen, wenn man Prefetch-Instruktionen (ergo Assembler) einfügt, außerdem ist das schwer Athlon-spezifisch. Geändert von zeckensack (2002-12-06 um 18:15:48 Uhr) |
![]() |
![]() ![]() |
![]() |
#7 (im Thread / einzeln) |
Gold Member
Threadstarter |
Schlüsselwörter in C++ im Detail
Hi,
kann mir jemand mal die folgenden Schlüsselwörter wirklich im Detail erklären: 1. Virtual 2. Union 3. Inline 4. Const 5. Void 6. Operator 7. und wenns geht, dann die wichtigsten von diesen #ifndef - Dingern. Ich möchte diese Schlüsselwörter mal wirklich im Detail kennen und deren sinnvollste Anwendung. Besonders weiß ich nichts über virtual ![]() MFG Einfachkrank
Über 5 Millionen Menschen hören HipHop. Schreib dich nicht ab! Lern Reden und Gehen :-D
www.michael-eberhardt.de |
![]() |
![]() ![]() |
![]() |
#8 (im Thread / einzeln) |
CPU-Guru
Registriert: 2001-12-15
Beiträge: 5.043
|
Re: Schlüsselwörter in C++ im Detail
Originally posted by Demirug Ich habe ein paar frühe Programmiererfahrungen mit einem Primzahlenprogramm gemacht. Der erste Ansatz war reines Brute Force und es lief furchtbar langsam (war übrigends ein 8086er, deshalb sowieso elends lahm). Nach und nach habe ich das Programm immer weiter optimiert und dabei einen riesen Aufwand betrieben. Also ich es dann später mit dem "Sieb des Eratosteles" (eigentlich ganz billiger Algorithmus) verglichen habe, war mein optimiertes Programm aber immer noch langsamer ![]() Also merken: Die richtigen Algorithmen sind gaaaaanz wichtig! Originally posted by Einfachkrank Bsp:
Die Größe der Union ist die Größe des größten Elements (hier: double, also wahrscheinlich 8 Bytes) Die anderen Sachen kann jemand anders sicher besser als ich erklären...
void
|
![]() |
![]() ![]() |
![]() |
#9 (im Thread / einzeln) |
3D-Guru
Registriert: 2001-08-08
Beiträge: 10.068
|
Die meisten findest du hier: http://msdn.microsoft.com/library/de...asp?frame=true
Union ist eine struct, bei der sämtliche Member an derselben Adresse anfangen. Das ist sinnvoll, wenn man von einer Gruppe von Variablen immer nur eine braucht, oder z.B. auf die einzelnen Bytes eines Integer direkt zugreifen will. Was für "#ifndef Dinger"? |
![]() |
![]() ![]() |
![]() |
#10 (im Thread / einzeln) |
Grandmaster Member
Registriert: 2002-03-10
Beiträge: 12.026
|
Re: Schlüsselwörter in C++ im Detail
Ich hol mir mal die Rosinen :)
Originally posted by Einfachkrank 4. const ist ein 'Versprechen' des Programms an den Compiler, die so deklarierte Variable nicht zu verändern. Das erlaubt a)aggressivere Optimierung des Compilers b)eigene Fehler zu vermeiden Bsp:
6. operator + zB. 'Eingebaute' Operatoren wie eben +, -, +=, *= und andere können überladen werden, damit man so lustige Sachen wie
Geändert von zeckensack (2002-12-07 um 21:13:29 Uhr) |
![]() |
![]() ![]() |
![]() |
#11 (im Thread / einzeln) |
Platinum Member
|
zu 1)
Nach meinem Verständnis müssen (sollten?) als virtual ausgewiesene Methoden einer Basisklasse beim Ableiten eigener Klassen aus dieser Basisklasse eigens implementiert werden. Damit soll AFAIK sichergestellt werden, dass immer die zur Klasse passende Methode (v.a. beim Aufruf über Zeiger) gefunden wird. Würde man virtual weglassen, würde der Compiler beim Aufruf einer Methode einer abgeleiteten Klasse über einen Zeiger vom Typ der Basisklasse die Methode der Basisklasse aufrufen. Und dass kann Probleme machen. Beispiel gefällig?
Edit: Verdammtes Inline-Methoden-Implementiering ![]() Geändert von MeLLe (2002-12-08 um 17:08:53 Uhr) |
![]() |
![]() ![]() |
![]() |
#12 (im Thread / einzeln) |
Gold Member
Threadstarter |
![]()
Hi,
mir ist gerade noch was eingefallen -> Wo ist der Unterschied zwischen
Über 5 Millionen Menschen hören HipHop. Schreib dich nicht ab! Lern Reden und Gehen :-D
www.michael-eberhardt.de |
![]() |
![]() ![]() |
![]() |
#13 (im Thread / einzeln) |
Senior Member
Registriert: 2002-04-29
Beiträge: 136
|
Rein technisch ist der Unterschied, daß
Var ++ zu einem erhöhen des Wertes nach der Auswertung des gesamten Ausdrucks führt, während ++ Var zu einem erhöhen des Wertes vor Beginn des Ausdrucks führt. Beispiel: int i = 5; print(i ++); ===> Ausgabe: 5 int j = 5; print(++ j); ===> Ausgabe: 6 Wenn nun der inkrement nicht in einem Ausdruck verwendet wird, sondern alleine in der Gegend rumsteht, gilt folgendes zu beachten: - bei einfachern Integern und so gibt es keinen Unterschied. - bei Klassen mit überladenem Increment Operator (operator ++) ist die Version mit dem ++ vor der Var deutlich schneller, da dort keine temp. Kopie erzeugt werden muß. |
![]() |
![]() ![]() |
![]() |
#15 (im Thread / einzeln) |
Gold Member
Threadstarter |
![]()
Hi,
ich hab noch mal ne kleine Frage zu den #ifdef Befehlen. Das sind ja quasi Anweisungen an den Präprozessor oder so ähnlich, der dann weiß ob dieser Teil des Codes mit compiled werden soll oder nicht, je nach dem ob das Ding definiert ist oder nicht. So weit richtig? Jetzt meine Frage, falls das so weit stimmt -> Wie kann ich im Code Sachen definieren, die abhängig sind von der Programmeinstellung. Beispiel: In nem Game soll die eine Option zur Verfügung stehen, mit der man Schatteneffekte ein und ausschalten kann. Jetzt möchte ich, falls sie ausgeschaltet sind, einen State nicht definieren, der dann die Codeteil auslässt, welche für die Projektion von Schatten zuständig wären.(und anders herum solls natürlich auch funzen ![]() Ich hoffe das war klar und deutlich ![]() MFG Einfachkrank
Über 5 Millionen Menschen hören HipHop. Schreib dich nicht ab! Lern Reden und Gehen :-D
www.michael-eberhardt.de |
![]() |
![]() ![]() |
![]() |
#16 (im Thread / einzeln) |
3DCenter Crew & 3D-Guru
|
Mit "if else" Anweisungen zum Beispiel.
Also in etwas so:
Es gibt auch noch eine C++ Lösung die mit virtuellen Methoden arbeitet. Diese hat den Vorteil das man damit die ifs eliminieren kann. Allerdings ist sowas nur für jemanden zu empfehlen der sich gut mit OOP auskennt. Wenn du willst kann ich ein auch dafür ein Code Beispiel posten. |
![]() |
![]() ![]() |
![]() |
#18 (im Thread / einzeln) |
3DCenter Crew & 3D-Guru
|
So bitte:
|
![]() |
![]() ![]() |
![]() |
#19 (im Thread / einzeln) |
Avantgarde Member
Registriert: 2001-10-23
Beiträge: 5.411
|
Also im groben hab ichs verstanden aber ein paar Fragen hab ich noch. :-)
Ich muss doch nun trotzdem noch ne if-Anweisung reinnehmen um Render.SetShadows(false) auszuführen, wenn ichs nich haben will oder hab ich da was falsch verstanden? Vielleicht kannst du ja mal erklären wie man mit diesen Code anschließend umgeht. Mfg Nasenbaer |
![]() |
![]() ![]() |
![]() |
#20 (im Thread / einzeln) |
3DCenter Crew & 3D-Guru
|
In deinem Renderloop wird immer nur Render.Render () aufgerufen. Die Render.SetShadows () Methode wird nur dann aufgerufen wenn man über das Menü oder die Konsole die einstellung für die Schatten ändert. Der Vorteil dabei ist das man im normalen Renderloop die if Anweisungen so beseitigen kann (nicht alle) und if Anweisungen bzw jede Art von bedingten Sprüngen mögen moderne CPUs nicht so sehr.
|
![]() |
![]() ![]() |
![]() |
Lesezeichen |
Ansicht |
![]() |
![]() |
![]() |
|
|