Frage

Ich habe nicht Spiele programmiert seit etwa 10 Jahren (Meine letzte Erfahrung war DJGPP + Allegro), aber ich dachte, ich XNA Besuche über das Wochenende würde, um zu sehen, wie es war die Gestaltung bis zu.

Ich bin ziemlich beeindruckt, aber da ich einen Spiel-Engine um Stück zusammen weiter, ich habe eine (wahrscheinlich) grundlegende Frage.

Wie viel sollten Sie verlassen sich auf C # 's Delegierten und Events um das Spiel zu fahren? Als Anwendungsprogrammierer, verwende ich die Delegierten und Ereignisse stark, aber ich weiß nicht, ob es ein erheblicher Aufwand, dies zu tun.

In meiner Game-Engine, ich habe ein „Chase cam“ von Sorten entwickelt, die an ein Objekt angebracht werden können und dann neu berechnet seine Position relativ zum Objekt. Wenn sich das Objekt bewegt, gibt es zwei Möglichkeiten, um die Chase-cam zu aktualisieren.

  • haben eine "UpdateCameras ()" Methode im Hauptspiel Schleife.
  • Verwenden Sie einen Event-Handler, und haben die Jagd cam object.OnMoved abonnieren.

Ich bin das letztere verwendet wird, weil es mich an die Kette Ereignisse ermöglicht zusammen und schön große Teile des Motors zu automatisieren. Plötzlich, was groß und komplex wäre bekommen fiel bis auf eine Handvoll von 3-5 Linie Event-Handler ... Es ist eine Schönheit.

Wenn jedoch Event-Handler jedes Nanosekunde entpuppen eine große Verlangsamung Brennen, ich werde es entfernen und mit dem Loop-Ansatz gehen.

Ideen?

War es hilfreich?

Lösung

Wenn Sie sind ein Ereignis als Teilnehmerliste denken, in Ihrem Code alles, was Sie tun, einen Teilnehmer registriert. Die Anzahl der Anweisungen, die zur Erreichung erforderlich ist wahrscheinlich auf der CLR Ebene minimal sein.

Wenn Sie Ihren Code wollen Generika oder dynamisch sein, dann müssen Sie überprüfen, ob etwas vor abonniert ist ein Ereignis zu nennen. Die Veranstaltung / Delegierter Mechanismus von C # und .NET dies zu sehr geringen Kosten (in Bezug auf CPU) Sie zur Verfügung stellt.

Wenn Sie wirklich besorgt über jeden Taktzyklus sind, dann würden Sie nie generic / dynamische Spiellogik schreiben. Es ist ein Kompromiss zwischen wartbar / konfigurierbare Code und geradezu Geschwindigkeit.

gut geschrieben, ich würde bevorzugen Ereignisse / Delegierten, bis ich beweisen könnte es ein Problem ist.

Der einzige Weg, Sie wirklich wissen, ob es ein Problem für Sie ist, ist von Ihrem Code Profilieren - die Sie sollten auf jeden Fall für jedes Spiel Entwicklung tun

!

Andere Tipps

Es ist wichtig zu erkennen, dass die Ereignisse in C # nicht asynchrone Ereignisse anstehen (wie zum Beispiel die Windows-Nachrichtenwarteschlange). Sie sind im Wesentlichen eine Liste von Funktionszeigern. So ein Ereignis Erhöhung nicht über schlechtere Auswirkungen auf die Leistung als durch eine Liste von Funktionszeiger iteriert und jeder Aufruf.

Zur gleichen Zeit, erkennt, dass aus diesem Grunde, Ereignisse synchron sind. Wenn Ihre Veranstaltung Hörer langsam ist, werden Sie die Klasse verlangsamen Anhebung die Ereignisse.

Die wichtigste Frage hier scheint zu sein: „Was ist der Overhead, der mit der Verwendung von C # Delegaten und Ereignissen?“

Veranstaltungen haben wenig erheblichen Mehraufwand im Vergleich zu einem normalen Funktionsaufruf.

Die Verwendung von Delegierten kann impliziten und somit versteckten Müll erstellen. Müll kann eine wesentliche Ursache Performance Probleme vor allem auf der XBox360.

Der folgende Code erzeugt, um 2000 Bytes von Müll pro Sekunde (bei 60 fps) in der Form von Objekten EntityVisitor:

    private delegate void SpacialItemVisitor(ISpacialItem item);

    protected override void Update(GameTime gameTime)
    {
        m_quadTree.Visit(ref explosionCircle, ApplyExplosionEffects);
    }

    private void ApplyExplosionEffects(ISpacialItem item)
    {
    }

Solange Sie vermeiden Müll zu erzeugen, die Delegierten schnell genug für die meisten Zwecke. Wegen der versteckten Gefahren, ziehe ich es, sie zu vermeiden und Schnittstellen stattdessen verwenden.

In meiner mehr Zeit weg von realer Arbeit, ich habe zu XNA gelernt.

IMHO (oder nicht so bescheiden, wenn Sie meine Mitarbeiter fragen) ist, dass der Aufwand für das Ereignis behandelt wird durch andere Elemente im Spiel wie Rendering überwältigt werden. In Anbetracht der starken Gebrauch von Ereignissen in normalen .NET-Programmierung würde ich der zugrunde liegende Code sein ist gut optimiert.

Um ehrlich zu sein, ich zu einem UpdateCameras Methode denken gehen könnte eine vorzeitige Optimierung sein. Das Ereignissystem hat wahrscheinlich mehr andere Anwendungen als die Kamera.

XNA fördert die Nutzung von Schnittstellen, Veranstaltungen und Teilnehmer etwas damit geschrieben fahren. Werfen Sie einen Blick auf die GameComponent bezogenen Klassen, die dies für Sie einrichten.

Die Antwort lautet: „So viel wie Sie sich wohl fühlen“.

ein wenig zu erarbeiten, Wenn Sie zum Beispiel von der gamecomponent Klasse in eine cameracontroller Klasse nehmen und erbt und an die Game.Component Sammlung. Dann können Sie Ihre Kamera-Klassen erstellen und sie zu Ihrem cameracontroller hinzuzufügen.

Auf diese Weise wird die cameracontroller verursachen regelmäßig und in der Lage aufgerufen werden, um die richtige Kamera oder mehrere Kameras auswählen und aktivieren, wenn das ist, was Sie wollen.

Hier ist ein Beispiel dafür (Alle seine Tutorials sind ausgezeichnet): ReoCode

Als beiseite, können Sie interessiert sein zu wissen, dass Shawn Hargreaves , ursprüngliche Entwickler von Allegro , ist einer der wichtigsten Entwickler auf dem XNA-Team: -)

Bevor ich in das, was die Auswirkungen eines Ereignisses in Bezug auf die Leistung, die Sie müssen zunächst beurteilen, ob es erforderlich ist.

Angenommen, Sie wirklich versuchen, einen Chase-Cam zu halten aktualisiert und es ist nicht nur ein Beispiel für das, was Sie suchen, ist kein Ereignis (obwohl Ereignisse genauso gut den Trick tun könnte), wenn Sie ein Avatar Wahrscheinlichkeit folgen ist es wird die meiste Zeit bewegen.

Ein Ansatz, den ich äußerst wirksam ist hierarchischer Transformationen zu verwenden, wenn Sie implementieren diese effizient die Kamera nicht das einzige Objekt sein, von einem solchen System zu profitieren, würde das Ziel, die Kamera im Koordinatenraum des halten sein Objekt sie verfolgt.

Dieser Ansatz ist nicht die beste, wenn man eine gewisse Elastizität auf die Geschwindigkeit und Weise anwenden möchten, in dem die Kamera das Objekt verfolgt, denn das ist, ist es am besten ein Update Aufruf zu verwenden, einen Verweis, und einige grundlegende Beschleunigung und Widerstand Physik.

Veranstaltungen sind nützlich für Dinge, die nur von Zeit zu Zeit passieren oder dass viele verschiedenen Aspekte der Anwendung, wie ein Charakter sterben, wahrscheinlich viele verschiedenen Systeme beeinflussen möchten so eine Veranstaltung bewusst sein, töten Statistiken, die Steuerung AI, und so weiter, in einem solchen Fall alle Objekte zu verfolgen, die sich ständig haben würde, um zu prüfen, ob dies geschehen ist, ist weit weniger wirksam als ein Ereignis zu werfen und mit allen interessierten Objekte nur benachrichtigt, wenn es passiert.

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