Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

21

03.06.2010, 22:26

Ich würde mir eine "Sound aus"-Funktion wünschen, oder eine Lautstärkeregelung für Effekte und Musik!
Natürlich könnte man sich abhelfen, indem man alle Sounds/Musikstücke durch "leere" Dateien ersetzt ;)

TGGC

1x Rätselkönig

  • »TGGC« ist der Autor dieses Themas

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

22

03.06.2010, 22:31

game.ini kopieren
Kopie game_mute.ini nennen
in der in ini Datei die letzten 3 Zeilen in 0 editieren
"dmc.exe game_mute.ini" startem

;-)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

23

03.06.2010, 22:36

Hab mal eben einen Blick in den Code geworfen. Was mir aufgefallen ist, ist der doch freizügige Gebrauch von ungesicherten dynamischen Allokationen. (new/delete in GPIngame). Ich hab jetzt explizit kein Beispiel gesucht, wo das ein Problem wird, aber ich denke mal, dass sich schon ein Szenario finden liese.

Ebenfalls eher negativ aufgefallen sind die vielen magischen Konstanten im Code (siehe GPIngame::RenderHud)

Unschön sind halt auch die auskommentierten Codestücke, die man immer mal wieder findet.

Die Breite des Codes ist auch nicht wirklich konsistent. Meist ist es auf ca. 86 beschränkt, aber ab und zu hast du auch 190er drin. ;)

Ansonsten finde ich den Stil gut. Ich würd einige Sachen anders machen, aber er ist konsistent und das gefällt mir (zugegeben schaffe ich das eben selbst nicht immer, vor allem, wenn ich älteren Code von mir habe..).

24

04.06.2010, 11:16

Du kannst auch ohne alle Dateien in ein Archiv kopieren zu müssen sicherstellen, ob jemand eine modifiziert oder eine Orginalversion benutzt. Mir fallen da schlagartig mehrere Möglichkeiten ein, wobei die Offensichtlichste etwas mit Checksummen zu tun hat. Entweder prüfst du jede Datei einzeln oder bildest eine eigene Checksumme über den Inhalt aller benutzten Dateien, wenn der Wert vom Original abweicht, so sind die Dateien modifiziert.

TGGC

1x Rätselkönig

  • »TGGC« ist der Autor dieses Themas

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

25

04.06.2010, 21:26

@drakon: Bin ich wirklich nicht gewohnt, das sich Leute mit sowas auseinandersetzen Ich mache sowas auch selten. Also schonmal danke fuer die umfangreiche Antwort.

Das mit den ungesicherten news war mir noch gar nicht bewusst. Wie macht man denn aus einem ungesicherten ein gesichertes new? Da wir in der Engine einen Memory Manager hatten, bin ich eigentlich sicher, das wir in dem Bereich keine Fehler haben.

Mit der GUI hast du auf jeden Fall Recht, denn dafuer hatten wir noch keinen Editor, da die ganzen GUI Klassen nie auf die Engine V2 portiert wurden. Das ist alles von Hand gecodet per Trial and Error. Jedes Element so lange verrueckt und kompiliert bis es gepasst hat...

Der eigentlich Stil des Teams waren eigentlich diese 190 Zeichen pro Zeile (oder zumindestens von dem Coder der 90% Der Renderengine geschrieben hat), damit bin ich aber nie zurecht gekommen. Gab jedenfalls viel Code mit so Monsterzeilen. Ich habe staendig die Haelfte der Zeile uebersehen und den Sinn des Codes ueberhaupt nicht kapiert. Der hintere Teil war oft mit Tabs eingereuckt, so das man gar nicht sah, das noch was kommt. Sollte man also wirklich vermeiden sowas und bei einem Team gleich in die Codekonventionen schreiben.

@HighligerBimBam:
Dann ist die Checksumme auch so eine Art komprimierte Version der Dateien, nur das ich zusaetzlich noch die anderen Daten zum Vergleich brauche. Wir strebten damals eine aehnliche Loesung wie Quake/pk3 an. Das erschlaegt gleichzeitig auch noch andere Probleme. Es war auch schon fast alles entsprechend gekapselt, das sowas funktioniert haette - ausser z.b. das FindFile fuer die mp3 Dateien. f'`8k


Gruß, TGGC (der kostenlose DMC Download)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

26

04.06.2010, 21:34

Das mit den ungesicherten news war mir noch gar nicht bewusst. Wie macht man denn aus einem ungesicherten ein gesichertes new? Da wir in der Engine einen Memory Manager hatten, bin ich eigentlich sicher, das wir in dem Bereich keine Fehler haben.

Naja. Ihr habt da ja irgenwas mit new gemacht, weiss also nicht genau, was ihr da macht. Aber ich hätte da wahrscheinlich einen einfachen Smart Pointer (scoped) genommen oder so.
Wie gesagt ich müsste mir alles mal genau durchschaue, um ein Beispiel zu finden, wo es zu einem Problem kommen könnte. Kann aber durchaus sein, dass ihr da noch selber was handelt, um das dann zu verhindern. So genau habe ich es nicht angeschaut.

Warum hast du denn Probleme mit ein wenig breiteren Zeilen? Mit einem genügend grossen Bildschirm (17'') ist das ja kein Problem..

//EDIT:

Also habe nochmal kurz reingeschaut. z.B im Konstruktor von GPMenu werden ja ein paar Allokationen mit new gemacht und im Destruktor freigegeben. Wenn jetzt irgendwo dazwischen eine Exception kommt, dann passieren böse Dinge, wenn die Zeiger nicht initialisiert sind (was bei euch ja nicht der Fall ist) und sie mit delete zerstört werden (undefiniert, aber Absturz wahrscheinlich).
Das scheint ihr aber mit dem implementieren von einem eigenen new gelöst zu haben. (hab mal eine Exception provoziert und es gibt keinen Laufzeitfehler)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »drakon« (04.06.2010, 21:51)


CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

27

05.06.2010, 11:28

Also habe nochmal kurz reingeschaut. z.B im Konstruktor von GPMenu werden ja ein paar Allokationen mit new gemacht und im Destruktor freigegeben. Wenn jetzt irgendwo dazwischen eine Exception kommt, dann passieren böse Dinge, wenn die Zeiger nicht initialisiert sind (was bei euch ja nicht der Fall ist) und sie mit delete zerstört werden (undefiniert, aber Absturz wahrscheinlich).
Das scheint ihr aber mit dem implementieren von einem eigenen new gelöst zu haben. (hab mal eine Exception provoziert und es gibt keinen Laufzeitfehler)


Wo ist für dich "dazwischen"? Solange der Konstruktor nicht vollständig ausgeführt wurde (d.h. alle Allokationen ohne Exceptions dazwischen erfolgreich durchgeführt und somit alle Pointers zwangsläufig initialisiert wurden), wird der Destruktor nie ausgeführt, und somit auch kein uninitialisierter Pointer deleted. Der Worst Case ist, dass bereits alloziierter Speicher bei Exception in der Mitte des Konstruktors nicht freigegeben wird, uninitialisierte Pointers werden dabei aber garantiert nicht per Destruktor angerührt.
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

28

05.06.2010, 12:07

Also habe nochmal kurz reingeschaut. z.B im Konstruktor von GPMenu werden ja ein paar Allokationen mit new gemacht und im Destruktor freigegeben. Wenn jetzt irgendwo dazwischen eine Exception kommt, dann passieren böse Dinge, wenn die Zeiger nicht initialisiert sind (was bei euch ja nicht der Fall ist) und sie mit delete zerstört werden (undefiniert, aber Absturz wahrscheinlich).
Das scheint ihr aber mit dem implementieren von einem eigenen new gelöst zu haben. (hab mal eine Exception provoziert und es gibt keinen Laufzeitfehler)


Wo ist für dich "dazwischen"? Solange der Konstruktor nicht vollständig ausgeführt wurde (d.h. alle Allokationen ohne Exceptions dazwischen erfolgreich durchgeführt und somit alle Pointers zwangsläufig initialisiert wurden), wird der Destruktor nie ausgeführt, und somit auch kein uninitialisierter Pointer deleted. Der Worst Case ist, dass bereits alloziierter Speicher bei Exception in der Mitte des Konstruktors nicht freigegeben wird, uninitialisierte Pointers werden dabei aber garantiert nicht per Destruktor angerührt.


Du hast Recht. Ich wollt eigentlich auf das zweite hinaus, hab dann aber nicht mehr richtig mitgedacht. Hab mir sogar ursprünglich überlegt, ob es ein Tool gibt, was Speicherverbrauch (respektive das Speicherlecks) findet, wegen genau dem Fall, denn du nennst. Ist aber denke ich eher schwer zu finden.

TGGC

1x Rätselkönig

  • »TGGC« ist der Autor dieses Themas

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

29

06.06.2010, 09:44

Also wenn man was im Konstruktor nicht angelegt werden kann, weil der Speicher alle ist, dann ist es ziemlich egal ob danach ein Speicherleck uebrigbleibt. Das Programm wird direkt danach sowieso beendet. Wenn der Speicher alle ist, dann ist er halt alle und man kann sowieso keinen mehr herzaubern. Ob man in dem Moment noch faehig ist, irgendwelche Smartpointer abzuraeumen, ist ohnehin fraglich. Wichtig ist, bei normalen Programmablauf soll kein Speicher verschwendet werden. f'`8k


Gruß, TGGC (der kostenlose DMC Download)

idontknow

unregistriert

30

06.06.2010, 11:25

Gibts den Engine Source eigentlich auch zum download oder habe ich den nur noch nicht gefunden?^^

Das Spiel selber, muss ich zu meiner Schande gestehen, habe ich noch gar nicht angespielt aber bin fleißig am stöbern im Source Code gerade die einheitliche Kommentierung der Files ist etwas was ich mir in ner ähnlichen Art und Weise auch angewöhnen sollte :).

Ich werd heute Abend mal das Spiel anspielen, bin jetzt nur erstmal weg :)

Werbeanzeige