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

CodingCat

1x Contest-Sieger

  • »CodingCat« ist der Autor dieses Themas

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

11

20.05.2013, 17:15

Ganz ehrlich, sicherlich ist das mal interessant und auch spannend über so Zeug wie hier zu sprechen, aber ich behaupte der Alltagsprogrammierer hier wird das meiste davon nicht brauchen.

Was ist denn für dich ein Alltagsprogrammierer? Derjenige, der all die supereasy Crapware für Handys, Websites, Photodruck & Co. schreibt, die bei jedem 4. Klick mit Verlust sämtlicher Daten droht und bei jedem 8. Klick mehrminütige Denkpausen einlegt?

Ich behaupte wenn de_struktor ein Spiel schreibt wird er sich nicht groß um Ressourcenmanagement für Texturen kümmern müssen. Der Content Manager von XNA kümmert sich für ihn darum und sein Speicher wird ausreichend sein. Natürlich davon ausgegangen dass es sich hier um kein Spiel im High End RPG Style mit 1000en Texturen handelt.

Spiele gehören mitunter zu den ressourcenintensivsten Anwendungen überhaupt; unabhängig davon, ob das in diesem Fall zutrifft, ist Ressourcenverwaltung eine elementare Kernkompetenz, ohne die Programmierer nachfolgende Generationen schlussendlich nur mit Sondermüll belasten, wie er uns schon heute in all unseren Software-Ökosystemen in unerträglichen Dosen das tägliche Arbeiten zur Hölle macht.

Ich selbst habe ja nun einige Jahre mit C# arbeiten dürfen/müssen (eher dürfen) und habe selbst nur sehr selten IDisposable benötigt. C# kann durch den GC auch wirklich ätzend werden, wenn man es dann wirklich benötigt. Meiner Meinung nach aber nicht unbedingt weil der Speicher nicht schnell genug freigegeben wird (ganz ehrlich was schreibt ihr bitte für Anwendungen;) ) sondern eher weil bestimmte Ressourcen nicht schnell genug freigelegt werden.

Um nichts anderes geht es hier, es geht ausdrücklich nicht um Speicher, siehe Post 1.

Da wäre zum Beispiel Netzwerk und Sockets ein Beispiel was ja schon angesprochen wurde. Ich denke solange ich Ressourcen nicht selbst manage (unmanaged resources) brauche ich mir in den meisten Fällen bei C# weniger Gedanken um Dispose etc machen.

Du musst aber eben selbst managen, sobald du aus vorgefertigten Umgebungen wie XNA (das meines Wissens nach auch nicht mehr weiterentwickelt wird) rausgehst. Und selbst in solchen Umgebungen findest du Klassen, die IDisposable implementieren.

Das schöne an .Net ist doch dass sich um sowas gekümmert wird.

Nein, es wird sich grundsätzlich nicht implizit um andere Ressourcen gekümmert; using deckt einen Teil der Problematik mit IDisposable-Klassen ab, aber auch nur innerhalb einer Funktion.

Als C++ Entwickler gibt man das nur ungern aus der Hand weil man sich hier halt um alles selbst kümmert, aber bei .Net ist es halt so. Und meiner Meinung nach sind selbst die Smartpointer bei C++ nicht ansatzweise so einfach wie der GC.

In C++ musst du dank "Smart Pointers" nicht selbst managen, insofern nehmen sie dir bei der Ressourcenverwaltung im Gegensatz zum C#-GC einen ganzen Batzen Arbeit ab.

Das Problem (was ja schon angesprochen wurde) sind ja Referenzzyklen. Und die kann man sich nun mal schnell einhandeln wenn man nicht aufpasst. Dann kann man natürlich am Design schrauben und machen und tun, aber das Design zu ändern nur weil meine Referenzverwaltung sonst nicht klar kommt ist auch nicht der beste Weg.

Referenzzyklen sind meiner bisherigen Erfahrung nach ein wesentlich geringeres Problem, als man vielleicht annehmen würde. Es ist längst gängige Best Practice in allen Softwaresystemen, diese als azyklischen Graphen aufzuziehen. Das hat vor allem softwaretechnische Gründe, z.B. unabhängige Prüfbarkeit, Wartbarkeit, Reuse, Austauschbarkeit etc. Ich habe seit Jahren eine Weak-Pointer-Klasse, mit der sich solche Zyklen lösen ließen, sollten sie denn mal auftreten. Fazit: Ich habe die Klasse in all den Jahren kein einziges Mal genutzt.

Deswegen denke ich dass das hier alles eine Sache ist bei welcher man stark zwischen Sprachen unterscheiden kann. Wenn man C++ und C# vergleichen möchte kann man auch Assembler und C vergleichen. Beide unterscheiden sich stark voneinander und haben eigentlich auch andere Anwendungszwecke.

Der Vergleich hinkt aber gewaltig. C++ ist konzeptuell bis heute eine der stärksten Hochsprachen, die leider an ganz anderen Problemen wie der altbelasteten Syntax, der unglücklichen Grammatik, des veralteten Modulsystems etc. leidet. Ein Vergleich der Konzepte von C++ und C# ist auf keinen Fall unsinnig, weil beide Sprachen sehr ähnliche Ziele verfolgen, nämlich möglichst fehlerarme Programmierung. Gerade in Bezug auf Ressourcenverwaltung und Fehlerbehandlung erreicht C# in meinen Augen bis heute nicht die Vollständigkeit, Eleganz und Konsequenz von C++.
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »CodingCat« (20.05.2013, 17:21)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

12

20.05.2013, 17:28

Da hat auch vielleicht jeder eine andere Vorstellung was Sprachen bzw deren Einsatzgebiet angeht. Und natürlich war der Vergleich überzogen. So sollte es etwas deutlicher werden. Ich möchte auch bestimmt nicht sagen, man soll seine Software nicht vernünftig ausarbeiten und Problemfälle prüfen. Robuste Software ist sehr wichtig, das ist richtig, ich kann mir trotzdem auch einfach zu viel Gedanken machen. Eben weil Rechner heute eine bestimmte Leistung haben, kann ich drauf verzichten wenn einige MB RAM erst später freigelegt werden. Natürlich ist das nicht der schönste Weg, kann mir aber eine Menge Arbeitszeit einsparen. Was den Durchschnittsentwickler anging, so meinte ich nicht unbedingt Entwickler die damit ihr Geld verdienen, sondern den Durchschnittsentwickler hier im Forum. Schüler, vielleicht um die 16 Jahre alt, lernt seit einem Jahr zu programmieren, fragt lieber als selbst zu denken ( ;) ), diskutiert gern Probleme tot, hat zu viel Zeit sich Gedanken zu machen (klingt alles böser als es wirklich gemeint ist). Jetzt bin ich mal dieser Durchschnittsentwickler und möchte ein Spiel mit XNA entwickeln. Von mir aus ein Jump N Run mit einem Spritesheet für die Level, einem für den Spieler und 10 für die Gegner und Items. Dazu kommen von mir aus noch 10 Grafiken für das Menü. Jetzt startet man das Spiel, befindet sich im Menü und wechselt dann in das eigentliche Spiel. Diese 10 Grafiken des Menüs werden natürlich nicht direkt freigegeben (vermutlich nicht, dank GC). Ist das aber nun schlimm? Als C++ Entwickler würde man normal dafür sorgen, dass alles schön freigegeben wird. Aber der Vorteil einer Sprache wie zum Beispiel C# ist doch, dass ich eben genau das nicht tun muss. Und natürlich sind Grafiken eigentlich unmanaged Ressourcen, aber im Fall von XNA habe ich ja den ContentManager der sich darum kümmert. Wenn mich das alles nervt, dann lasse ich halt die Finger von diesen Sprachen und bleibe bei C++. Ist in Ordnung und darf ja jeder so machen. Im Normalfall ist das Ressourcenmanagement von C# aber völlig in Ordnung und spart eine Menge Zeit und Energie.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

13

20.05.2013, 17:40

Man sollte sich aber gerade bei Spielen sehr wohl Gedanken um das Management von Ressourcen machen. Denn sonst hat man plötzlich eine Textur 100mal geladen statt einmal oder Sounds 100mal statt einmal, weil jede "Enemy" Instanz ihren eigenen Scheiß lädt. Das sollte man doch bitte tunlichst vermeiden. Und wenn man dann vielleicht das Zeug nichtmal freigeben kann, weil man kein Dispose() implementiert hat, na dann viel Spaß.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

De_Struktor

unregistriert

14

20.05.2013, 17:44

Zitat

Schüler, vielleicht um die 16 Jahre alt, lernt seit einem Jahr zu programmieren, fragt lieber als selbst zu denken ( ;) ), diskutiert gern Probleme tot, hat zu viel Zeit sich Gedanken zu machen (klingt alles böser als es wirklich gemeint ist).

(17)Hey, ich habe so viel zeit auch nicht, nur ich finde die Dinge unglaublich interessant, sodass ich manchmal wirklich mehr Frage als selbst zu Denken.
Dieser Thread hier z.b, in dem wollte ich mir natürlich auch etwas aneignen, aber da mein CSharp Buch komplette Grütze für MICH ist, weil es mehr für Umsteiger von anderen Sprachen ist als, fortgeschrittene Anfänger, wie Microsoft es bezeichnet :D

Aber, ich mache mir vielleicht zu viel Gedanken, da hast du recht^^

15

20.05.2013, 18:20

Da hat auch vielleicht jeder eine andere Vorstellung was Sprachen bzw deren Einsatzgebiet angeht. Und natürlich war der Vergleich überzogen. So sollte es etwas deutlicher werden. Ich möchte auch bestimmt nicht sagen, man soll seine Software nicht vernünftig ausarbeiten und Problemfälle prüfen. Robuste Software ist sehr wichtig, das ist richtig, ich kann mir trotzdem auch einfach zu viel Gedanken machen. Eben weil Rechner heute eine bestimmte Leistung haben, kann ich drauf verzichten wenn einige MB RAM erst später freigelegt werden
Aber es geht doch gar nicht um die paar MB RAM. Das diese erst später freigegeben werden, mag einige Leute stören aber hat nichts mit der Fragestellung hier zu tun. Es geht darum warum die Ressourcenverwaltung in Managed Sprachen Speicher gesondert verwaltet und wie man den GC nutzen könnte um auch andere Systemressourcen (Filehandles, Sockets, etc.) zu verwalten.
Warum muss eine Datei nachdem sie geöffnet wurde, wieder geschlossen werden. Der GC sollte in der Lage sein zu ermitteln ob ein Zugriff auf das Handle noch möglich ist und dieses gegeben Falls schließen. So wie auch Objekte automatisch zerstört werden, die nicht mehr erreicht werden können.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

16

20.05.2013, 18:27

Soweit ich den Thread hier verstehe, ging es damit los, dass eine Spielerklasse IDisposable implementieren sollte. Da hat BlueCobold schon geschrieben, dass sie das im Normalfall nicht tun muss. Ich habe übrigens nie behauptet, dass Spiele Ressourcenschonend sind und man sich dort absolut keine Gedanken machen muss. Bei XNA kümmert sich aber (wie auch schon mehrfach geschrieben wurde) der ContentManager um Texturen, Sounds etc. Deshalb lade ich eine Textur zum Beispiel nicht 1000 mal, sondern nur ein mal. Genauso kümmert sich auch der ContentManager darum, dass die Texturen, etc wieder freigegeben werden.
@De_Struktor: Ich meinte nicht speziell dich, sehe aber dass die neueren Mitglieder sich immer mehr in diese Richtung entwickeln. Eine Stunde selbst denken ist halt schwerer als eine Woche diskutieren.
Allgemein wollte ich zum Ausdruck bringen, dass man nicht jede Sache tot diskutieren muss. Hier ist das aber anscheinend gewünscht und das dürft ihr ja auch gern tun;) Aber an dieser Stelle klinke ich mich dann aus.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

17

20.05.2013, 18:37

Cat hat aus gutem Grund einen neuen Thread aufgemacht, die Überlegung entstand in dem Thread von de_Struktor. Jedoch ist die Diskussion von der Problemstellung vollkommen losgelöst. Es geht nicht um die Spielerklasse die IDisposable implementiert oder auch nicht, es geht nicht um XNA und dessen ContentManager der das alles übernehmen kann. Es geht einfach darum, warum in managed Sprachen nur die Ressource Speicher verwaltet wird und wie man Informationen die der GC eh schon besitzt nutzen kann, um auch andere Ressourcen zu verwalten und nicht den C++ Weg mittels IDisposable/using bzw. AutoClosables/try-catch nachbilden zu müssen.

De_Struktor

unregistriert

18

20.05.2013, 19:11

Er hat es ja nur gut gemeint, dann muss man sich nicht wie Geier auf ihn stürzen^^

Werbeanzeige

Ähnliche Themen