C und C++: Komerzielle Spiele mit verfügbaren Quelltexten



  • Ich poste das einfach mal hier. Im Laufe der Jahre habe ich mir immer mal wieder verfügbare Quellen von Spielen angeschaut. Dabei ist mir aufgefallen, dass der Code meistens unglaublich schlecht ist. Einfach schlecht strukturiert für Projekte mit solch einem Umfang. Beispiele:

    Jagged Alliance 2
    Komplett in C mit dem Visual Studio 6.0 geschrieben. Kein Wunder, dass das Spiel nie das Release-Date halten konnte. Es ist absolut schwer nachzuvollziehen, was wo welche Änderungen bewirkt. Ich denke C++ wäre hier besser gewesen.

    Quake
    Sehr rühmliche Ausnahme, was C Spiele angeht. Wirkt einfach durchdacht und sauber.

    Warcraft und Starcraft
    Leider nicht Open Source. Aber für jeden der dachte, Blizzard liefert nur Qualität ab, hier am besten mal ein Link vom Chefprogrammierer:

    http://www.codeofhonor.com/blog/tough-times-on-the-road-to-starcraft

    With the switch to releasing on Microsoft Windows, Bob chose to use the Visual Studio compiler and re-architected the game engine in C++. Both were reasonable choices but for the fact that — at that point — few developers on the team had experience with the language and more especially with its many pitfalls

    Jetzt kommt es:

    History tells us that programmers feel compelled to try every feature of their new language during the first project, and so it was with class inheritance in StarCraft. Experienced programmers will shudder when seeing the inheritance chain that was designed for the game’s units:

    CUnit < CDoodad < CFlingy < CThingy

    CThingy objects were sprites that could appear anywhere on the game map, but didn’t move or have behaviors, while CFlingys were used for creating particles; when an explosion occurred several of them would spin off in random directions. CDoodad — after 14 years I think this is the class name — was an uninstantiated class that nevertheless had important behaviors required for proper functioning of derived classes. And CUnit was layered on top of that.

    und

    And beyond the horror of the class hierarchy, the CUnit class itself was an unholy mess defined across multiple header files:

    class CUnit ... {
        #include "header_1.h"
        #include "header_2.h"
        #include "header_3.h"
        #include "header_4.h"
    };
    

    Each of those headers was several hundred lines, leading to an overall class definition that could at best be called amusing.

    It wasn’t until many years later that the mantra “favor composition over inheritance” gained credence among programmer-kind, but those who worked on StarCraft learned the hard way much earlier.

    Unter der Haube also wohl Murks und spieltechnisch qualitativ nur erste Sahne, weil Patrick Wyatt meiner Meinung nach zwei wichtige Eigenschaften mitbringt:

    1.) Er ist offen für neue Technologien (Siehe den Einsatz von C++). Wobei ich das riskant finde, wenn eine Sprache für die meisten Projektmitglieder unbekannt ist. Heute würde lacht auch jeder über die Vererbungshierarchie, aber ich glaube, damals wusste man es einfach noch nicht besser (OOP).

    2.) Er zieht Änderungen durch. Auch wenn damit große Teile vom Projekt überarbeitet werden müssen oder Deadlines nicht gehalten werden. Diesen Punkt kennt glaube ich jeder von uns. Irgendwas ist wie es ist und es ist einfach hässlich. Und keiner fasst es an. Aus Angst 😃 Und irgendwann hat es sich manifestiert und man bekommt es aus dem Quelltext nicht mehr raus.

    Ich könnte noch mehr Beispiele aufführen, belasse es aber mal dabei. Aber es ist schon interessant, wie schlecht viele Programme geschrieben sind. Vlt. kann hier ja jemand Einblicke in weitere kommerzielle Programme geben? Oder Firmenerfahrungen posten 🙄



  • Der source code von Freespace 2 wurde veröffentlicht (in C). Hab ihn mir selbst nicht angeschaut, aber die, die damit arbeiten haben öfters gemeint es wäre recht gut designter code, was durchaus zum Erfolg vom "Freespace Source Code Project" verholfen haben soll.



  • Civilzation IV, kannste sogar selbst ändern und neu compilieren, hab ich auch schon gemacht (ohne Änderungen)



  • hardware schrieb:

    Civilzation IV, kannste sogar selbst ändern und neu compilieren, hab ich auch schon gemacht (ohne Änderungen)

    Echt?
    Gut zu wissen, ich mach mich mal auf die Suche, das wuerde mich wirklich interessieren.



  • Falls du dich für solche Anekdoten interessierst, solltest du dir mal die John Carmack Quakecon Vorträge anhören.
    https://www.youtube.com/user/BCEMCOCATb/videos





  • Danke für die Links, die sind super interessant!



  • staaaarcraft schrieb:

    Warcraft und Starcraft
    Leider nicht Open Source. Aber für jeden der dachte, Blizzard liefert nur Qualität ab, hier am besten mal ein Link vom Chefprogrammierer:

    http://www.codeofhonor.com/blog/tough-times-on-the-road-to-starcraft

    Danke für den Link. Starcraft I war toll. Ich fand dagegen Starcraft II und Diablo III extrem scheiße, schade um das raus geschmissene Geld.



  • staaaarcraft schrieb:

    http://www.codeofhonor.com/blog/tough-times-on-the-road-to-starcraft

    Sehr interessanter Blog!

    Bei Teil 2 habe ich mich aber etwas gefragt: Patrick Wyatt sagt, std::list sei schlecht, weil man in O(n) sucht (aha) und diese Suche angeblich selbst schreiben müsse (was nicht stimmt). Scheint so, als wäre er bis heute nicht mit der C++-Standardbibliothek vertraut. Sein Vergleich mit Intrusive-Lists ist zudem unausgeglichen, wie Joe in seinem Kommentar sehr schön feststellt.

    Ausserdem ist auch interessant, wie Patrick auf einen Kommentar, dass es sich nicht lohne, das Rad schlechter neu zu erfinden, reagiert:

    There is value to having a common language for developers to share. One of the problems with modern C++, STL and boost is that language is too big, and requires too much specialized knowledge, for programmers to be effective.

    To the extent that we can simplify the concepts and reduce the knowledge required for new team members to join the project, we can increase their productivity.

    Die Logik ist also, statt allgemein bekanntem Wissen müssen sich die Entwickler ein spezifisches Framework aneignen, das sich den üblichen Paradigmen widersetzt... um weniger Wissen zu benötigen?

    Das zeigt meines Erachtens eine Problematik, die in der Spieleentwickler-Szene weit verbreitet ist: Neueste Grafikfeatures werden schnell übernommen, aber Entwicklungen der Programmiersprache werden teilweise um Jahrzehnte verschlafen. Die Argumente sind fast immer haltlos, im Stil "unsere Implementierung ist schneller (weil sie es 1997 war)" oder "wir haben mehr Kontrolle". Bei langjähriger Erfahrung kommt Uneinsichtigkeit dazu ("wozu sollen wir jetzt umstellen, nachdem wir 4 AAA-Games so geschrieben haben"). Die Tatsache, dass viele Spiele fragwürdigen Code dahinter haben, schaukelt sich zudem negativ auf ("Game XY machts auch so, also muss es gut sein"). Viele Spieleentwickler begreifen einfach nicht, wie viel produktiver sie sein könnten, würden sie modernes C++ verwenden.


  • Mod

    One of the problems with modern C++, STL and boost is that language is too big, and requires too much specialized knowledge, for programmers to be effective.

    Soweit ich weiss, ist die Standardbibliothek von C++ noch relativ uebersichtlich (im Vergleich zu bspw. Java). (Die Sprache selbst ist tatsaechlich ein wenig monstrous geworden)



  • Das schlägt sich auch in der Literatur nieder.

    Ich meine so Lehrbücher wie der Scherfgen doer 3D-Spieleprogrammierung mit C++ und DirectX9 in 21 Tagen. Mal unabhängig von der fachlichen Materie, aber der dort geschriebene Code ist alles aber kein halbwegs modernes C++, eher C mit Klassen und Makros.

    Wer kennt nicht das gute alte:

    #define SAFE_DELETE(x) if ( (x) != NULL ) delete (x);
    #define SAFE_DELETE_ARRAY(x) if ( (x) != NULL ) delete[] (x);
    
    // ...
    int * ar = new int[235];
    // ...
    SAFE_DELETE_ARRAY(ar);
    


  • delete nullptr;
    delete[] nullptr;
    

    Böse?



  • TNA schrieb:

    http://de.wikipedia.org/wiki/Liste_kommerzieller_Computerspiele_mit_ver%C3%B6ffentlichtem_Quelltext

    Wow. Gothic 3 ist da aufgelistet, weil ein aus der Community stammendes Entwicklerteam Den Quellcode für die patches bekommen hat.

    Alle Gothicteile scheinen wohl ziemlich schlechten Code zu haben. Sie sind zwar nicht verfügbar, aber für die ersten wurde für Modarbeiten das Disassemblieren erlaubt und das ist ziemlich einfach, weil die Datei noch Debug Symbole (???) enthält.

    Beide haben fast den gleichen Code und der ist nur mäßig: Wenigstens sind OOP, templates vorhanden und bei der Fehlerausgabe wird auch manchmal auf streams zurückgegriffen. Allerdings fehlen die STL-container und stattdessen gibt es eigene. Außerdem haben alle Klassen seltsame Prefixes, nämlich zC oder oC.
    Es gibt aber auch jede Menge seltsame Implementierungen, z.B. stürzt das programm bei der Methode

    zCMenuItem* zCMenu::GetActiveItem()
    

    einfach ab, wenn es kein aktives item gibt und statt dass einfach ein nullpointer zurückgegeben wird, muss der Aufrufer vorher sich mit

    zCMenuItem* zCMenu::GetNumberOfActiveItem()
    

    die id geben lassen, die -1 ist, wenn kein item ausgewählt ist. Zudem bauen die Klassen oft ziemlich direkt auf der 3d-Schnittstelle auf. Es ist schon ein Wunder, dass die Spiele wirklich laufen, auch wenn sich die Beschreibungen von StarCraft dagegen wesentlich schlimmer anhören.


  • Mod

    #define SAFE_DELETE(x) if ( (x) != NULL ) delete (x);
    #define SAFE_DELETE_ARRAY(x) if ( (x) != NULL ) delete[] (x);
    

    Der größte Blödsinn auf Erden.


  • Mod

    Arcoth schrieb:

    #define SAFE_DELETE(x) if ( (x) != NULL ) delete (x);
    #define SAFE_DELETE_ARRAY(x) if ( (x) != NULL ) delete[] (x);
    

    Der größte Blödsinn auf Erden.

    Dann kennst du wohl noch nicht genug von dem Blödsinn, den es auf der Erde so gibt. 🙂



  • Kritiker++ schrieb:

    delete nullptr;
    delete[] nullptr;
    

    Böse?

    Nö.
    Macht nichts.


  • Mod

    Nathan schrieb:

    Nö.

    Ich bin verdammt böse. Denn wieso sollte man ein sinnloses Statement im Code stehen haben? 😡



  • Arcoth schrieb:

    Nathan schrieb:

    Nö.

    Ich bin verdammt böse. Denn wieso sollte man ein sinnloses Statement im Code stehen haben? 😡

    Andere Zeiten.


Anmelden zum Antworten