Rechenaufwand in C # - Verwendung von Getter / Setter vs. Arrays direkt Modifizieren und Gießgeschwindigkeiten

StackOverflow https://stackoverflow.com/questions/3018536

Frage

Ich wollte einen langatmigen Beitrag schreiben, aber ich werde es einkochen hier:

Ich versuche, die grafische AltSchoolart der NES über XNA zu emulieren. Aber meine FPS ist langsam, versuchen 65K Pixel pro Bild zu ändern. Wenn ich nur eine Schleife durch alle 65K Pixel und setzte sie zu einer beliebigen Farbe, ich 64fps bekommen. Der Code, den ich gemacht, um-up, was Farben, wo platziert werden soll, bekomme ich 1FPS.

Ich denke, es ist wegen meiner objekt orented ist Code.

Im Moment, ich habe Dinge aufgeteilt in sechs Klassen, mit Getter / Setter. Ich vermute, dass ich zumindest bin 360K Getter pro Frame aufrufen, die ich denke, eine Menge Overhead ist. Jede Klasse enthält entweder / und-oder 1D- oder 2D-Arrays mit benutzerdefinierten Aufzählungen, int, Farbe oder Vector2D Bytes.

Was passiert, wenn ich alle Klassen in nur einem kombiniert, und der Zugriff auf die Inhalte der einzelnen Array direkt? Der Code würde ein Chaos aussehen, und Graben, die Konzepte der objektorientierten Codierung, aber die Geschwindigkeit könnte viel schneller sein.

Ich bin auch besorgt, nicht über Zugriffsverletzungen, wie alle Versuche, die Daten in den Feldern in den Blöcken durchgeführt werden get / set. Z. B. alle Schreiben an Arrays stattfinden wird, bevor alle Daten von ihnen zugegriffen wird.


Wie zum Gießen, erklärte ich, dass ich mit benutzerdefinierte Aufzählungen, int, Farbe und Vector2D Bytes. Welche Datentypen sind am schnellsten zu verwenden und den Zugang in .NET Framework, XNA, XBox, C #? Ich denke, dass konstantes Gießen hier eine Ursache der Verlangsamung sein könnte.

Auch anstelle von Mathematik, um herauszufinden, welche Indizes Daten sollten in platziert werden, habe ich vorberechnet Lookup-Tabellen verwendet, so muss ich konstante Multiplikation nicht verwenden, Addition, Subtraktion, Division pro Frame. :)

War es hilfreich?

Lösung

Es ist eine tolle Präsentation von der GDC 2008, die lesenswert ist, wenn Sie ein XNA-Entwickler sind. Es heißt Verständnis XNA Framework Performance .

Für Ihre aktuelle Architektur - Sie haben nicht wirklich beschrieben es gut genug, um eine definitive Antwort zu geben - Sie wahrscheinlich zu viel unnötige „Dinge“ tun, in einer engen Schleife. Wenn ich raten müsste, würde ich vorschlagen, dass Ihre aktuelle Methode wird die Cache-Dreschen -. Sie Ihre Daten Layout beheben müssen

Im Idealfall sollten Sie eine schöne, große Auswahl an kleinen as möglich haben Werttypen (structs nicht Klassen) und eine stark inlined Schleife dass shoves Daten in linear.

( Abgesehen : in Bezug auf was schnell ist: Integer und Mathematik Floating-Point ist sehr schnell - in der Regel sollten Sie keine Tabellen verwenden Lookup-Funktion Anrufe sind ziemlich schnell - bis zu dem Punkt, dass das Kopieren von großen. structs, wenn Sie geben sie nicht mehr von Bedeutung sein wird Der JIT einfache Getter und Setter INLINE -. Sie können sie aber nicht darauf Inline alles andere in sehr engen Schleifen hängen sollte -. wie Ihr blitter)

JEDOCH - auch wenn optimiert - Ihre aktuelle Architektur saugt. Was Sie tun, fliegt in das Gesicht, wie eine moderne GPU funktioniert. Sie sollten Ihre Sprites auf Ihre GPU und lässt sie zusammengesetzte Szene werden geladen.

Wenn Sie Ihren Sprites auf Pixelebene manipulieren wollen (zum Beispiel: Palettentausch, wie Sie erwähnt haben), dann sollten Sie Pixel-Shadern werden. Die CPU auf dem 360 (und auf PC) ist schnell, aber die GPU ist so viel schneller, wenn Sie so etwas wie dies tun!

Die Sprite Effects XNA Probe ist ein guter Ort, um loszulegen.

Andere Tipps

Haben Profil Sie Ihren Code, um zu bestimmen, wo die Verlangsamung ist? Bevor Sie Ihre Anwendung gehen Umschreiben, sollten Sie wissen zumindest die Teile neu geschrieben werden müssen.

ich stark vermuten, dass der Aufwand für die Zugriffs- und Datenkonvertierungen ist trivial. Es ist viel wahrscheinlicher, dass Ihre Algorithmen unnötige Arbeit machen, Werte neu zu berechnen, sie könnten zwischenzuspeichern, und andere Dinge, die Ihr Objekt-Design ohne Sprengung angesprochen werden kann.

angeben Sie eine Farbe und so für jedes Pixel oder so etwas? Wenn das der Fall ist, ich glaube, Sie wirklich über die Architektur etwas mehr denken. Starten Sie Sprites mit dieser Geschwindigkeit wird die Dinge.

EDIT

Okay, ich denke, was Ihre Lösung mehr Sprites mit verschiedenen Farben Last sein könnte (ein Sprit von wenigen Pixeln) und diejenigen wieder verwenden. Es ist schneller auf die gleiche Sprite als eine andere Farbe zu jedem Pixel zuzuordnen, wie das Sprite bereits in den Speicher geladen wurde,

Wie bei jedem Performance-Problem, sollen Sie die Anwendung profilieren, die Engpässe, anstatt zu versuchen zu erraten, zu identifizieren. Ich bezweifle ernsthaft, dass Getter und Setter an der Wurzel des Problems sind. Der Compiler inlines fast immer diese Art von Funktionen. Ich bin auch neugierig, was Sie gegen Mathematik haben. Multipliziert man zwei ganze Zahlen, zum Beispiel, ist eine der am schnellsten Dingen der Computer tun kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top