Auf welche Fallstricke sind Sie beim Schreiben von Spielen für den PC mit einer verwalteten Sprache wie C # gestoßen und wie haben Sie sie gelöst?
Auf welche Fallstricke sind Sie beim Schreiben von Spielen für den PC mit einer verwalteten Sprache wie C # gestoßen und wie haben Sie sie gelöst?
Antworten:
Ich weiß nicht viel über Java, also ist dies aus der Sicht eines .net-Entwicklers.
Das mit Abstand größte ist Müll. Die .net-Müllabfuhr unter Windows leistet fantastische Arbeit, und Sie können weitestgehend ohne Babysitting davonkommen. Auf der xbox / winPhone7 ist das eine andere Sache. Wenn Sie alle paar Frames blockieren, kann die Garbage Collection zu Problemen führen. Im Moment wird es nach jeder Zuweisung von 1 MB ausgelöst.
Hier ein paar Tipps zum Umgang mit Müll. Sie sollten sich über die meisten dieser Probleme in der Realität keine Gedanken machen müssen, aber sie könnten sich eines Tages als nützlich erweisen.
GC.GetTotalMemory()
auf den Bildschirm. Dies gibt Ihnen einen ungefähren Überblick über die Menge der zugewiesenen Bytes, die Ihr Spiel verwendet. Wenn es sich kaum bewegt, geht es dir gut. Wenn es schnell geht, haben Sie Probleme.GC.Collect()
jeden Frame an. Es mag wie eine gute Idee erscheinen, den Überblick über Ihren Müll zu behalten, aber denken Sie daran, dass das Einzige, was schlimmer ist als eine Müllsammlung, die Müllsammlung ist vorbei.StringBuilder
(Vorsicht, StringBuilder
ist kein Wundermittel und kann trotzdem Zuweisungen verursachen! ) Oder Das Verwenden von foreach
Schleifen über Sammlungen, die die IEnumerable
Schnittstelle verwenden, kann auch ohne Ihr Wissen zu Datenmüll führen (dies ist beispielsweise foreach (EffectPass pass in effect.CurrentTechnique.Passes)
häufig der Fall).IDisposable
für Klassen zu verwenden, die nicht verwaltete Ressourcen enthalten. Sie können diese verwenden, um den Speicher zu bereinigen, den der GC nicht selbst freigeben kann.Das andere, worüber man nachdenken sollte, ist die Gleitkomma-Performance. Der .Net JITer führt zwar eine ganze Reihe prozessorspezifischer Optimierungen durch, kann jedoch weder SSE noch andere SIMD-Befehlssätze verwenden, um die Gleitkomma-Mathematik zu beschleunigen. Dies kann bei Spielen zu einem großen Geschwindigkeitsunterschied zwischen C ++ und C # führen. Wenn Sie Mono verwenden, verfügen diese über einige spezielle SIMD-Mathematikbibliotheken, die Sie nutzen können.
Eine typische Leistungsfalle ist, dass der Müllsammler bei der Gestaltung / Entwicklung des Spiels nicht berücksichtigt wird. Das Produzieren von zu viel Müll kann zu "Schluckauf" im Spiel führen, was passiert, wenn der GC über eine beträchtliche Zeitspanne läuft.
Bei C # können die Verwendung von Wertobjekten und die Anweisung "using" den Druck durch den GC verringern.
using
Aussage hat nichts mit Garbage Collection zu tun! Es ist für IDisposable
Objekte gedacht, mit denen nicht verwaltete Ressourcen freigegeben werden (dh für Objekte, die nicht vom Garbage Collector verwaltet werden ).
Ich würde sagen, das größte Problem beim Schreiben von Spielen in C # war das Fehlen anständiger Bibliotheken. Die meisten, die ich gefunden habe, sind entweder direkte, aber unvollständige Ports oder Wrapper über eine C ++ - Bibliothek, die einen hohen Leistungsverlust für das Marshalling verursachen. (Ich spreche speziell über MOgre und Axiom für die OGRE-Bibliothek und BulletSharp für die Bullet-Physikbibliothek.)
Verwaltete Sprachen (anders als interpretiert - weder Java noch C # werden tatsächlich interpretiert) können genauso schnell sein wie Muttersprachen, wenn Sie genau wissen, was sie tatsächlich verlangsamt (Marshalling, Garbage Collection). Ich denke, das eigentliche Problem ist, dass Bibliotheksentwickler das noch nicht erkannt haben.
Wie bereits erwähnt, sind GC-Erfassungspausen das größte Problem. Die Verwendung von Objektpools ist eine typische Lösung.
C # und Java werden nicht interpretiert. Sie werden zu einem Zwischenbytecode kompiliert, der nach JIT genauso schnell wird wie nativer Code (oder so gut wie bedeutungslos ist).
Die größte Gefahr, die ich gefunden habe, besteht darin, Ressourcen freizugeben, die sich direkt auf die Benutzererfahrung auswirken. Diese Sprachen unterstützen nicht automatisch die deterministische Finalisierung wie C ++. Wenn Sie dies nicht erwarten, kann dies dazu führen, dass in der Szene Meshes schweben, nachdem Sie dachten, dass sie zerstört wurden. (C # führt eine deterministische Finalisierung durch IDisposable durch . Ich bin mir nicht sicher, was Java tut.)
Davon abgesehen sind verwaltete Sprachen in der Lage, die Leistung, die Spiele erfordern, um einiges besser zu bewältigen, als es ihnen zugetraut wird. Gut geschriebener verwalteter Code ist viel schneller als schlecht geschriebener nativer Code.
IDisposable
Ermöglicht die deterministische Bereinigung zeitkritischer und nicht verwalteter Ressourcen, wirkt sich jedoch nicht direkt auf die Finalisierung oder den Garbage Collector aus.
Weder Java noch C # werden interpretiert. Beide werden in nativen Maschinencode kompiliert.
Das größte Problem bei beiden und den Spielen ist, dass sie so codieren müssen, dass sie während des Spiels niemals Müll sammeln. Die Anzahl der Reifen, durch die Sie springen müssen, um dies zu erreichen, überwiegt fast die Vorteile der ersten Verwendung. Die meisten Funktionen, mit denen die Verwendung dieser Sprache für die Programmierung von Anwendungen oder Servern Spaß macht, müssen für die Spielprogrammierung vermieden werden, da es sonst zu langen Pausen während des Spiels kommt, wenn die Sprachen losgehen und Müll sammeln.
Eine große Gefahr, die ich beim Erstellen von Spielen mit solchen Sprachen (oder beim Verwenden von Tools wie XNA, TorqueX usw.) sehe, ist, dass es Ihnen schwer fallen wird, ein Team guter Leute mit dem Fachwissen zu finden, das erforderlich ist, um ein gleichwertiges Spiel zu erstellen Es wäre ziemlich einfach, Leute in C ++ und OpenGL / DirectX zu finden.
Die Spieleentwicklungsbranche ist immer noch sehr stark von C ++ geprägt, da die meisten Tools und Pipelines, mit denen große oder nur gut polierte kleine Spiele herausgepusht werden, in C ++ geschrieben wurden. Soweit ich weiß, gibt es ALLE offiziellen Entwickler-Kits, die Sie verwenden können Get für XBox, PS3 und Wii sind nur mit Kompatibilität für C ++ erhältlich (das XBox-Toolset kann heutzutage besser verwaltet werden, weiß jemand mehr?)
Wenn Sie Spiele für Konsolen entwickeln möchten, erhalten Sie XNA und C # auf der XBox und dann nur in einem Teil der Spielbibliothek namens XBox Live Indie Games. Einige, die Wettbewerbe usw. gewinnen, werden ausgewählt, um ihr Spiel auf die echte XBox Live Arcade zu portieren. Anders als dieser Plan, ein Spiel für den PC zu machen.