XNA 2D-Kollisionserkennung ohne GetData ()

7

Ich arbeite derzeit an einem Worms-Spiel, das eine Geländeverformung beinhaltet. Früher habe ich es getan, das Farbarray geändert .GetData()und dann verwendet .SetData(), aber ich habe versucht, es zu ändern, um die Arbeit stattdessen auf der GPU zu erledigen (mithilfe von RenderTargets).

Damit läuft alles gut, aber ich bin auf ein anderes Problem gestoßen. Meine gesamte Kollisionserkennung gegen das Gelände basierte auf einem Farbarray, das das Gelände darstellt, aber ich habe dieses Farbarray nicht mehr. Ich könnte .GetData()jedes Mal verwenden, wenn ich das Gelände ändere, um mein Farbarray zu aktualisieren, aber das würde den Zweck meiner anfänglichen Änderungen zunichte machen.

Was ich in Ordnung wäre, wäre, es .GetData()am Anfang einmal zu verwenden und dieses Array dann basierend auf den Änderungen, die ich später am Gelände vornehme, auf andere Weise zu ändern. Ich weiß allerdings nicht, wie ich das machen soll, kann mir jemand helfen?

Benixo
quelle

Antworten:

3

Ich habe ein bisschen recherchiert und noch keine Lösung gefunden, um GetData-Aufrufe jedes Mal zu entfernen, wenn mein Terrain geändert wird, aber ich habe Möglichkeiten gefunden, es zu "optimieren" oder zumindest die GetData-Aufrufe als zu reduzieren so viel wie möglich.

  • Die Kraterzeichnung wird gestapelt, was bedeutet, dass ich sie nicht alle beim Erstellen zeichne, sondern zu einer Liste hinzufüge und alle paar Frames alle zeichne. Dies reduziert die Anzahl der GetData-Aufrufe - einen pro Stapel Krater und nicht einen pro Krater.

  • Nachdem ich Krater zum Renderziel gezeichnet habe, warte ich einige Frames, bevor ich GetData aufrufe, um sicherzustellen, dass die GPU alle Zeichenbefehle verarbeitet hat. Dies minimiert Pipeline-Stillstände.

  • Wenn ein ausstehender GetData-Aufruf ausgeführt werden muss und weitere Krater eingehen, bleiben die Krater gestapelt, bis der GetData-Aufruf abgeschlossen ist. Mit anderen Worten, das Zeichnen und Abrufen wird synchronisiert, sodass ein GetData-Aufruf immer mehrere Frames nach dem Zeichnen eines Kraterstapels erfolgt und alle neuen Kraterzeichnungsanforderungen bis nach einem ausstehenden GetData warten.

Wenn jemand andere Vorschläge hat, würde ich mich trotzdem freuen, sie zu hören.

Benixo
quelle
Ich habe mich gefragt: Wenn das Spiel rundenbasiert ist, kannst du nicht einfach zu GetData()Beginn jeder Runde einen Anruf tätigen ?
Jonathan Connell