C++ Code Optimierung



  • Hehe. Auch nicht doof 🙂



  • ok ich habe alles umgewandelt und execute_cycle geinlined. Leider gibt es keinen Unterschied zu früher weder im debug noch im release mode. Je nach Spiel hab ich zwischen 100 und 120 fps auf einem 3,5 GHz Amd. 60 fps sind Originalgeschwindigkeit.
    Trotzdem danke. Wie meintest du das, die Methoden static machen und den this Zeiger explizit übergeben? Ich denke static Methoden sind nicht Objekt gebunden und somit hat der this Zeiger keine Bedeutung? Kann man denn eine ganze Klasse static setzen. Wie gesagt ich hab in der Regel immer nur eine Instanz pro Klasse. Ich frage mich wirklich, ob es was bringt das Klassenkonstrukt aufzulösen.


  • Mod

    PiCiJi schrieb:

    ok ich habe alles umgewandelt und execute_cycle geinlined. Leider gibt es keinen Unterschied zu früher weder im debug noch im release mode. Je nach Spiel hab ich zwischen 100 und 120 fps auf einem 3,5 GHz Amd. 60 fps sind Originalgeschwindigkeit.
    Trotzdem danke. Wie meintest du das, die Methoden static machen und den this Zeiger explizit übergeben? Ich denke static Methoden sind nicht Objekt gebunden und somit hat der this Zeiger keine Bedeutung? Kann man denn eine ganze Klasse static setzen. Wie gesagt ich hab in der Regel immer nur eine Instanz pro Klasse. Ich frage mich wirklich, ob es was bringt das Klassenkonstrukt aufzulösen.

    Gemeint ist

    void (*op_table[256])(Cpu*);
    

    statt

    void (Cpu::*op_table[256])();
    

    und dann an Stelle von this die Benutzung des übergebenen Zeigers.



  • Ja, genau das ist gemeint.

    Schade dass es nix gebracht hat, wunder mich doch etwas. Aber vielleicht geht die meiste Zeit ja ganz woanders drauf...?
    Was sagt denn der VTune?

    Und... was ist das überhaupt für ein Projekt?
    Emulation, Spiele, 4 CPUs ... klingt irgendwie interessant.



  • ok ich habe jetzt eine ganze Klasse meines Projektes statisch gemacht. Das bringt ca. 2 fps mehr. Als nächstes werde ich die Cpu Klasse statisch machen. Mal schauen, ob es noch mehr bringt. Ziel ist es dann alle Klassen statisch zu machen und keine Objekte mehr anzulegen. Ausnahme ist die Config Klasse.

    Ich bastle seit letztem Januar 06 an einem Snes Emulator.

    So ich habe jetzt compuserve performance analyser verwendet. Ok das Programm gibt mir eine ganze Reihe infos. Wird ne Weile dauern alles auszuwerten. Am meisten ist er damit beschäftigt auf Interrupts zu überprüfen. Jeder Maschinenbefehlzyklus verbraucht 6,8 oder 12 Clockzyklen. Somit wird nach jeden verbrauchten 6,8 oder 12 Clockzyklen überprüft ob ein Interrupt verarbeitet werden muss.



  • Eu. Also irgendwas musst du da wohl falsch machen, SNES Emulatoren gibts einige die auf sehr bescheidener Hardware bereits gut laufen 😉



  • hustbaer schrieb:

    Eu. Also irgendwas musst du da wohl falsch machen

    ja, er benutzt c++ mit klassen, 'this' und dem ganzen schnickschnack 😉
    hier gibts'n paar, einige mit source codes:
    --> http://www.zophar.net/snes.html



  • na das kommt auf die Genauigkeit an. Die meisten Emulatoren arbeiten einen ganzen Maschinenbefehl am Stück ab. Das geht deutlich schneller, als wenn immer nur ein Zyklus abgearbeitet wird und dann synchronisiert wird. Vor ein paar Jahren war ein Zyklen genauer Emulator nicht wirklich interressant, da zu langsam. Das sieht jetzt anders aus. Zyklengenaue Emulation ist besonders für ältere Systeme mit geringen Cpu Geschwindigkeiten sinnvoll. Individualanpassungen für einzelne Spiele werden somit verschwindend gering. Die Fehlerwahrscheinlichkeit ist geringer, schließlich kann man nicht alle Spiele, inklus. allen Spielsituationen testen.



  • Ok, klar. Obwohl... gerade das gucken ob ein Interrupt anliegt... ob das wirklich Zyklengenau gehen muss?
    Als Programmierer kann man sich sowieso nicht gut drauf verlassen dass dies oder jenes jetzt genau N Zyklen dauert und dann genau bei diesem oder jenem Zyklus der Interrupt kommt...



  • ich überprüfe nicht darauf, ob er exakt die position erreicht hat, sondern addiere die vergangenen Clockzyklen zum letzten Wert hinzu und überprüfe dann, ob was in diesem Zeitraum passiert ist. Aber ich habe noch ein paar Ideen. Jetzt mache ich die Cpu Klasse statisch.

    edit: So ein Mist man kann keine statischen, anonymen unions verwenden. Das bedeutet hunderte von Variablen, die ich umbenennen muss. Der Aufwand ist mir zu gross für höchstwahrscheinlich keinen Geschwindigkeitsgewinn.


Anmelden zum Antworten