XNA und C # gegen die 360 ​​im Auftragsprozessor

14

Nachdem ich diesen Artikel gelesen habe , habe ich das Gefühl, dass sie wahrscheinlich Recht haben (da Xenon und CELL BE sehr empfindlich gegenüber verzweigtem und Cache-ignorantem Code sind ), aber ich habe gehört, dass die Leute Spiele auch mit C # gut machen.

Stimmt es also, dass man mit XNA nichts professionelles machen kann ? Oder hat das Poster einfach gefehlt, was XNA zur Killer-API für die Spieleentwicklung macht?

Unter professionell verstehe ich nicht, dass man damit Geld verdienen kann, sondern vielmehr, dass die professionelleren Spiele über Phsyics-Modelle und Animationssysteme verfügen, die außerhalb der Reichweite einer Sprache mit solch eindeutigen Barrieren für das Wesentliche zu liegen scheinen . Wenn ich ein Kollisionssystem oder eine Fluiddynamik-Engine für mein Spiel schreiben wollte, habe ich nicht das Gefühl, dass C # mir die Möglichkeit bietet, dies zu tun, da der Laufzeitcode-Generator und das Fehlen von Intrinsics die Leistung beeinträchtigen.

Es scheint jedoch, dass viele Leute gut mit diesen Einschränkungen umgehen, ihre erfolgreichen Spiele machen, aber scheinbar jedes der Probleme durch Auslassen vermeiden. Ich habe nicht bemerkt, dass XNA-Spiele irgendetwas anderes komplexes machen als das, was bereits von den Bibliotheken bereitgestellt oder von Shadern gehandhabt wird. Ist dies die Vermeidung der komplexeren Spieldynamik aufgrund der Einschränkungen von C # , oder nur Leute, die sich darauf konzentrieren , es zu erledigen ?

Ehrlich gesagt kann ich nicht glauben, dass KI-Krieg so viele KI-Einheiten ohne einen datenorientierten Ansatz oder schmutzige C # -Hacks aufrechterhalten kann , damit es besser läuft als der Standardansatz, und ich denke, das ist zum Teil auch meine Frage, wie Haben die Leute C # gehackt, damit es das kann, was Spiele-Programmierer natürlich mit C ++ machen?

Richard Fabian
quelle
In der Tat schimpfen. Wenn ich keine Informationen über den Typen finde und sehe, dass er ein Startup ist, würde ich gerne jede Art von greifbaren Informationen sehen, um dies
Jonathan Connell,
Aus Gründen, die ich nicht vollständig verstehe, scheinen Studios nicht zuzugeben, XNA zu verwenden. Es gibt jedoch viele Beispiele hier Link
Tristan Warner-Smith
Nun, die offensichtliche Information, um es zu sichern, ist die Tatsache, dass die CPU bei verzweigtem Code, der C # ist, von Natur aus schlecht ist. Was ich wissen möchte, ist, was die professionellen XNA-Benutzer tun, bedeutet, dass sie das von C # auferlegte Soft-Limit nicht erreichen?
Richard Fabian
3
Ich verstehe die
Abwahlen
3
Ich denke, eine Menge Leute stimmen über Richards Frage ab, weil in seinem verlinkten Artikel (zahlreiche) technische Fehler enthalten sind und einige das Wort "professionell" nicht "Geld verdienen", sondern "Produktion auf Halo-Ebene" bedeuten. Letzteres ist eine schlechte Wahl, aber stimmen Sie nicht ab, nur weil Sie mit dem Link nicht einverstanden sind - entlarven Sie ihn, indem Sie stattdessen antworten.

Antworten:

21

OK, nur um ein paar Löcher in das Geschwätz zu stecken, das du verlinkt hast:

  • "C # ist auf einen" Just In Time "-Interpreter angewiesen - falsch - es ist ein JIT- Compiler . Nachdem eine Methode einmal JITted wurde , wird der kompilierte Code für jeden Aufruf erneut verwendet. Der kompilierte Code ist fast so schnell wie nativer, vorkompilierter Code.
  • „Xenon CPU ist ein‚in place‘Prozessor“ - bedeutet er „in Ordnung“? - Und: "Xenon-CPU hat keine Verzweigungsvorhersage" . Er impliziert dies bedeutet, dass die JIT-Kompilierung auf natürliche Weise fehlerhaften Code erzeugt, der von der CPU neu angeordnet werden muss, und viel Verzweigung verursacht - was absoluter Unsinn ist . Die gleichen Leistungsempfehlungen für die Ausführung auf dieser CPU-Architektur gelten sowohl für C ++ als auch für C #.
  • "[JIT] erfordert ständiges Spülen des 360" - falsch, der kompilierte Code kann wie jeder normal kompilierte Code im Cache gehalten werden. (Wenn er Rohrleitungsspülung meint, siehe den obigen Punkt.)
  • "generics use code generation" - generics sind wie alles andere JITted und wie alles andere ist der JITted-Code schnell. Es gibt keine Leistungseinbußen für die Verwendung von Generika.
  • "alle sexy sprachen erfordern eine [...] verzweigungsvorhersage ..." - wie trifft dies nicht auch auf c ++ zu? - "... oder [...] In-Place-Codegenerierung" - meint er JITting? Habe ich schon erwähnt, dass es schnell ist? (Ich werde nicht auf alle Bereiche eingehen , in denen die Desktop- CLR die eigentliche Codegenerierung verwendet - eine Funktion, die von der Xbox 360 nicht unterstützt wird!)
  • "[C # hat] nicht die massiven Bibliotheken [von C ++]" - außer zum Beispiel XNA selbst? Und vieles mehr . (Trotzdem ist dies ein ziemlich fairer Punkt.)

XNA auf der Xbox 360 läuft auf einer modifizierten Version der .NET Compact Framework CLR. Ich habe keinen Zweifel, dass es nicht dem Standard der Desktop-Version entspricht. Der JITter ist wahrscheinlich nicht so gut - aber ich denke auch nicht, dass er schlecht ist . Ich bin überrascht, dass er den im Vergleich zur Desktop-CLR schrecklichen Müllsammler nicht erwähnt hat .

(Natürlich - Sie sollten in einem professionell entwickelten Spiel sowieso nicht auf den Müllsammler treffen , genauso wie Sie bei Zuweisungen in einem professionellen Spiel vorsichtig sein müssen .)

(Für eine aktuelle technische Diskussion des .NET Compact Framework beginnen Sie möglicherweise mit dieser Artikelserie: Overview , JIT Compiler , GC und Heap .)

Die Art und Weise, wie er in Bezug auf seine Terminologie völlig unspezifisch ist, erschwert es, überhaupt zu verstehen, was er meint. Entweder ist er im Maximalmodus oder er weiß nicht, wovon er spricht.


Jetzt, wo wir haben , dass aus dem Weg, hier einige Dinge, die Sie tun auf verpassen von XNA mit auf den 360, anstatt going native :

  • Zugriff auf die SIMD / Vector-Einheit für wirklich schnelle CPU-Gleitkomma-Berechnungen
  • Möglichkeit zur Verwendung von muttersprachlichem Code, der wahrscheinlich etwas schneller als C # sein wird
  • Die Fähigkeit, ein bisschen zu sein etwas fauler mit , wie Sie Speicher zuweisen
  • XBLIG-Spiele haben nur Zugriff auf 4 der 6 Kerne (aber wir haben immer noch alle 3 CPUs und sie sind auch nicht voll, so dass wir nicht viel verpassen) - nicht sicher, ob dies für Nicht-XBLIG-XNA gilt Spiele
  • Voller DirectX-Zugriff für wirklich unübersichtliche grafische Tricks

Es ist auch erwähnenswert, dass dies nur CPU-seitige Einschränkungen sind. Sie haben immer noch freien Zugriff auf die GPU.

Ich habe diese Dinge in dieser Antwort auf die Frage beschrieben, die im Grunde genommen dieselbe ist wie diese. Wie ich in dieser Antwort erwähnt habe, ist XNA absolut für die "professionelle" Entwicklung geeignet .

Der einzige Grund, den Sie vermeiden sollten, besteht darin, dass Sie kein C # -Talent einstellen, C # -Module lizenzieren und vorhandenen C # -Code auf dieselbe Weise wiederverwenden können, wie Sie es mit der vorhandenen Basis von C ++ - Kenntnissen tun können. Oder weil Sie möglicherweise auch auf eine Plattform abzielen, die C # nicht unterstützt.

Für viele von uns, die keine "professionellen" Entwickler sind, ist XNA natürlich unsere einzige Option, um auf die Xbox 360 zuzugreifen.


Um Ihre anderen Fragen zu beantworten:

Nichts in C # hindert Sie daran, datenorientierte Ansätze genau so zu verwenden, wie Sie sie in C ++ verwenden würden.

C # ist nicht in der Lage, Code beim Kompilieren automatisch inline zu schreiben, und ich bin mir ziemlich sicher, dass der JITter der kompakten CLR keine Inline-Methoden kann (das kann die Desktop-CLR). Für leistungskritischen Code müssen Sie möglicherweise manuell in C # einbinden, wobei C ++ Unterstützung bietet.

Wahrscheinlich ist ein größerer Grund, warum Sie CPU-mathematikintensive Dinge wie Kollisionserkennung und Fluidsimulationen in C # nicht oft sehen, der fehlende Zugriff auf die Vektoreinheit (wie oben erwähnt).

Andrew Russell
quelle
Ich kann mich nicht erinnern, aber kann C # Sie nicht davon abhalten, durch einfache Arrays zu iterieren? Ich erinnere mich an etwas, das erstklassige Typen wie int, float, char in die Box packte, und aus diesem Grund funktionieren einige datenorientierte Ansätze nicht so schnell, wie sie konnten. Ist das richtig? Woran erinnere ich mich?
Richard Fabian
2
In C # werden Werttypen (nicht nur intrinsische Werte - Sie können eigene Werttypen erstellen) angezeigt, wenn Sie sie einem objectTyp zuweisen . Und in Version 1 (vor Generics) konnte man sie nicht in einen Nicht-Array-Container packen, ohne sie einzupacken. Aber heutzutage ist es extrem einfach, boxfreien Code zu schreiben. Mit dem CLR Profiler können Sie jeden Ort erkennen, an dem Sie boxen.
Andrew Russell
Ist es überhaupt möglich, einen JIT-Interpreter zu haben? Klingt paradox.
Die kommunistische Ente
Ich habe einige Threaded-Code-Techniken gesehen, die ich als JIT-Interpretation klassifizieren würde. Es ist definitiv ein Randfall.
1
@Roy T. Die " XNA Math Library " (Teil von DirectX) und das " XNA Framework " sind zwei völlig verschiedene Dinge mit einer sehr unglücklichen Namenskollision. Die Dokumentation, die Sie verlinkt haben, gilt nicht für das XNA Framework. Die mathematischen XNA Framework-Typen verwenden die SIMD / Vector-Einheit nicht .
Andrew Russell
5

Sie müssten "professionell" definieren. Könntest du Angry Birds, Plants vs Zombies usw. machen? Absolut. Könnten Sie Crysis 2, COD, Halo tun? Das bezweifle ich. Die Verwendung von C # wirkt sich nur auf Spiele aus, die sehr rechenintensiv sind und außerdem das letzte Byte des Arbeitsspeichers beanspruchen müssen (Sie verlieren an der Garbage Collection), sodass Sie immer noch eine Menge tun können.

Als Lerntool für Einsteiger, Prototyping-Tool, Plattform für das Schreiben von Spielen, die sich mit Kompromissen usw. auseinandersetzen können, ist es fantastisch und hat viel Kraft und Einfachheit Nennen Sie die "AAA" Spiele. Es beseitigt auch viele Schmerzen und Leiden, über die sich Menschen mit plattformübergreifender Portierung und Kompatibilität Sorgen machen müssen.

Wenn Sie sich ein fantastisches Spiel einfallen lassen und die Grenzen dessen, was Sie mit XNA tun können, kennen, dann würde ich vorschlagen, dass Sie sich direkt an MS wenden. Wenn die Idee wirklich gut genug ist, können Sie möglicherweise eine vollständige Entwicklung in die Hände bekommen kit.

Roger Perkins
quelle
Könnten Sie eine beschissene Fortsetzung von Duke Nukem machen? ;)
Jonathan Connell
1
Die meisten Benchmarks stellen fest, dass C # -Code zwischen 30% und 70% langsamer ausgeführt wird als der entsprechende C-Code (auf dem PC). Wenn Sie bedenken, dass die meisten Spiele nicht an die CPU gebunden sind und kritische Teile des C # -Codes mit unsicherem Code geschrieben werden können, der fast so schnell oder schneller als der entsprechende C-Code ausgeführt werden kann (schneller, weil das JIT über viel mehr Informationen verfügt) es als ein Compiler, so kann es eine bessere Optimierung Entscheidungen) macht , sehen Sie , dass C # für AAA - Spiele durchaus in der Lage ist.
BlueRaja - Danny Pflughoeft
@BlueRaja: Unsicherer Code ist für die meisten XNA-Entwicklungen auf der Xbox 360 keine Option.
1
@BlueRaja: Es sollte darauf hingewiesen werden, dass unsafeCode häufig langsamer als das sichere Äquivalent ist, da dadurch die Anzahl der Optimierungen verringert wird, die die CLR vornehmen kann. Man muss es messen.
Andrew Russell
2
@Blueraja "Wenn Sie bedenken, dass die meisten Spiele nicht CPU-gebunden sind", wird viel zitiert? Ich habe nicht an einem professionell entwickelten Spiel gearbeitet, das nicht in allen Achsen gebunden ist. Wenn es nicht so wäre, würden wir einen Weg finden, die Last auf diesen Teil der Maschine zu verlagern!
Richard Fabian
3

Die einfache Tatsache ist, dass Sie keine hohe Polygonzahl, volle HDR-Beleuchtung oder die interessanteste Physik der Welt benötigen, um ein interessantes Spiel zu erstellen. Wenn Ihr Spielplan keines davon enthält, warum sollten Sie nicht ein schnelleres wählen? Entwicklungszeit Lösung?

professionellere Spiele haben Phsyics-Modelle und Animationssysteme

Das ist einfach falsch. Professionelle Spiele haben das, was sie brauchen, um ihr Gameplay umzusetzen und ihren künstlerischen Look zu erreichen, und nicht mehr und nicht weniger. Ein Spiel ist nicht professioneller, weil es realistischer aussieht oder eine detailliertere Physik aufweist. Ein professionelles Spiel erreicht sein Gameplay und seine visuellen Ziele, pünktlich, im Rahmen des Budgets usw. und verschickt und macht Gewinn.

DeadMG
quelle
1
Hohe Polygonzahl und HDR würden auf die Grafikkarte fallen, oder? Sie sollten also in C # und C ++ genau die gleiche Leistung erwarten.
BlueRaja - Danny Pflughoeft
@BlueRaja: Es gibt auch CPU-Kosten für diese und Speicher - vor allem auf dem 360.
DeadMG
Mehr oder weniger ist der Aufwand für die Grafikbibliotheksaufrufe etwas höher als im nativen Code. Andererseits bemühen sich moderne Grafikbibliotheken SEHR, die Anzahl der Aufrufe des Treibers pro Frame zu verringern, da dies einer der Hauptengpässe ist.
drxzcl