Das Erste, was Sie verstehen müssen, ist die Hardware, auf der Sie ausgeführt werden. Wie geht es mit Verzweigungen um? Was ist mit Caching? Hat es einen SIMD-Befehlssatz? Wie viele Prozessoren kann es verwenden? Muss es die Prozessorzeit mit irgendetwas anderem teilen?
Möglicherweise lösen Sie dasselbe Problem auf sehr unterschiedliche Weise - selbst die Wahl des Algorithmus sollte von der Hardware abhängen. In einigen Fällen kann O (N) langsamer als O (NlogN) ausgeführt werden (abhängig von der Implementierung).
Als groben Überblick über die Optimierung möchte ich zunächst genau untersuchen, welche Probleme und welche Daten Sie lösen möchten. Dann optimieren Sie das. Wenn Sie extreme Leistung wünschen, dann vergessen Sie generische Lösungen - Sie können alles, was nicht zu Ihrem am häufigsten verwendeten Fall passt, in Sonderfällen ausführen.
Dann profilieren. Profil, Profil, Profil. Betrachten Sie die Speichernutzung, die Verzweigungsstrafen, den Funktionsaufruf-Overhead und die Pipeline-Auslastung. Finden Sie heraus, was Ihren Code verlangsamt. Es ist wahrscheinlich Datenzugriff (ich habe einen Artikel mit dem Titel "The Latency Elephant" über den Overhead des Datenzugriffs geschrieben - google es. Ich kann hier keine zwei Links posten, da ich nicht genug "Reputation" habe) Optimieren Sie dann Ihr Datenlayout ( schöne, große, flache, homogene Arrays sind fantastisch ) und den Datenzugriff (Prefetch, wo möglich).
Wenn Sie den Overhead des Speichersubsystems minimiert haben, versuchen Sie herauszufinden, ob Anweisungen jetzt der Engpass sind (hoffentlich), und sehen Sie sich dann die SIMD-Implementierungen Ihres Algorithmus an - SoA-Implementierungen (Structure-of-Arrays) können sehr datenintensiv sein Befehlscache effizient. Wenn SIMD für Ihr Problem nicht geeignet ist, sind möglicherweise Codierungen auf Intrinsics- und Assembler-Ebene erforderlich.
Wenn Sie noch mehr Geschwindigkeit benötigen, gehen Sie parallel. Wenn Sie den Vorteil haben, auf einer PS3 zu laufen, sind die SPUs Ihre Freunde. Benutze sie, liebe sie. Wenn Sie bereits eine SIMD-Lösung geschrieben haben, profitieren Sie massiv von SPU.
Und dann noch ein paar mehr. Test in Spielszenarien - ist dieser Code immer noch der Engpass? Können Sie die Art und Weise ändern, wie dieser Code auf einer höheren Ebene verwendet wird, um seine Verwendung zu minimieren (dies sollte eigentlich Ihr erster Schritt sein)? Können Sie Berechnungen auf mehrere Frames verschieben?
Erfahren Sie auf jeder Plattform so viel wie möglich über die verfügbare Hardware und die verfügbaren Profiler. Gehen Sie nicht davon aus, dass Sie den Engpass kennen - finden Sie ihn mit Ihrem Profiler. Und stellen Sie sicher, dass Sie eine Heuristik haben, um festzustellen, ob Sie Ihr Spiel tatsächlich schneller gemacht haben.
Und dann nochmal profilieren.