Ich weiß, dass Effizienz der Schlüssel zur Spielprogrammierung ist, und ich habe einige Erfahrungen mit dem Rendern einer "Karte" früher gemacht, aber wahrscheinlich nicht auf die beste Weise.
Für ein 2D-TopDown-Spiel: (Rendern Sie einfach die Texturen / Kacheln der Welt, sonst nichts)
Angenommen, Sie haben eine Karte von 1000 x 1000 (Kacheln oder was auch immer). Wenn sich die Kachel nicht in der Ansicht der Kamera befindet, sollte sie nicht gerendert werden - so einfach ist das. Sie müssen keine Kachel rendern, die nicht angezeigt wird. Da Ihre Karte jedoch 1000 x 1000 Objekte enthält oder weniger, möchten Sie wahrscheinlich nicht alle 1000 * 1000 Kacheln durchlaufen, um zu sehen, ob sie gerendert werden sollen oder nicht.
Frage: Wie lässt sich diese Effizienz am besten umsetzen? Damit es "schnell / schneller" bestimmen kann, welche Kacheln gerendert werden sollen?
Außerdem baue ich mein Spiel nicht um Kacheln, die mit einem SpriteBatch gerendert wurden, sodass es keine Rechtecke gibt. Die Formen können unterschiedliche Größen haben und mehrere Punkte haben, z. B. ein gekrümmtes Objekt mit 10 Punkten und eine Textur innerhalb dieser Form.
Frage: Wie stellen Sie fest, ob sich diese Art von Objekten "in" der Ansicht der Kamera befindet?
Mit einem 48x48-Rechteck ist das ganz einfach. Sehen Sie nur, ob sich X + Breite oder Y + Höhe in der Ansicht der Kamera befindet. Anders mit mehreren Punkten.
Einfach ausgedrückt, wie Sie den Code und die Daten effizient verwalten können, um nicht gleichzeitig eine Million Objekte durchlaufen / durchlaufen zu müssen.
Wenn Sie viele mobile Objekte haben, sollten Sie diese anhand ihrer Koordinaten in einer mehrdimensionalen Baumstruktur speichern. Auf diese Weise können Sie effizient eine Liste aller Objekte abrufen, die sich in einem bestimmten Rechteck befinden. Sie können sie sogar nach ihren x- oder y-Koordinaten sortieren lassen, was für die Zeichnungsreihenfolge wichtig ist, wenn sich Objekt-Sprites überlappen.
Dies ist auch sehr praktisch für die Kollisionserkennung.
Weitere Informationen finden Sie im Wikipedia-Artikel über kd-Bäume .
Wenn 2D-Bäume für Sie zu kompliziert sind, gibt es auch eine einfachere, aber nicht viel weniger effektive Alternative: Speichern Sie die Objekte als untergeordnete Elemente der Kacheln. Wenn Sie ein Objekt verschieben, entfernen Sie es aus der Objektliste der alten Kachel und fügen es in die Objektliste des neuen ein. Wenn Sie die Objekte zeichnen, durchlaufen Sie erneut die Kacheln im Ansichtsfenster und rufen deren Objekte ab. Dann sortieren Sie sie alle nach y-Koordinaten und zeichnen sie.
quelle
Ich weiß nicht, ob es der beste Weg ist, aber so lerne ich es:
Sie haben eine zweidimensionale Anordnung von "Kacheln"
Wenn Sie die Position der "Kamera" mit einem Vector2 festlegen, rendern Sie nur das, was sich in der Szene befindet. Das große Rechteck ist das, was Sie auf dem Bildschirm sehen können. Es ist nutzlos, den Rest der Szene zu zeichnen.
Jetzt müssen Sie die Offsets abrufen, vorausgesetzt, Ihre Kamera soll sich in der Mitte der Szene befinden:
In welchem Teil des Arrays beginnen und enden die sichtbaren Kacheln?
und in Ihrer Zeichenmethode durchlaufen Sie einfach den sichtbaren Teil des Arrays:
quelle
Sie können eine Bitmap haben, die die gesamte Szene darstellt, aber nicht angezeigt wird. Und dann eine angezeigte Bildschirm-Kamera-Bitmap, die nur aus der gesamten Szene zeichnet, aber nur den Teil, der angezeigt werden muss.
quelle