C und C++: Komerzielle Spiele mit verfügbaren Quelltexten
-
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::listsei 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.
-
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 MethodezCMenuItem* 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.
-
#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.
-
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.
-
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.