[D3D] Wie effizient Minimap zeichnen?
-
Wie kann man effizient eine Minimap zeichnen? Insbesondere das Landschaftsbild ist da interessant, es muss auch für eine 500x500 Karte noch gut funktionieren. Es ist jedoch nicht erforderlich, dass bei jedem Frame die Minimap komplett aktualisiert dargestellt wird.
Ich habe es jetzt eine ganze Zeit lang so gemact, dass ich mit GDI auf eine Surface zeichne (über mehrere Frames) und bei jedem Frame eine zweite Surface auf den Backbuffer kopiere. Sobald die zu zeichnende Surface fertig ist, werden sie ausgetauscht. Das ist natürlich sehr affig.
Ich habe aber nicht wirklich eine gute Idee, sie laufen fast alle auf das Locken einer Textur/Surface hinaus.
Ich vermute mal, dass man transformierte Vertexe in dieser Menge nicht mehr in Echtzeit rendern kann, oder? Wäre es vielleicht eine Möglichkeit, auf eine Textur zu rendern (über mehrere Frames verteilt), das wäre dann zumindest schon mal besser, als das GDI zu benutzen.Wie gesagt, es sollte schon einigermaßen effizient sein, einen Preis will ich damit aber nicht gewinnen. Ich brauche nur einen anständigen Ansatz.
-
Das "Landschaftsbild" solltest du einfach nur einmal vorrendern. Also einfach einmal einen Screenshot von oben machen, oder auch im Editor. Solange deine Minimap nicht auf 500x500 Pixel ist, kriegst du natütlich nicht die ganze Karte drauf, sondern hast pro Pixel nur 'ne Mischung der umliegenden Tiles.
Bye, TGGC
-
Das Landschaftsbild kann sich während des laufenden Spiels ändern, insbesondere ändert sich natürlich der Fog of War.
-
Und was verändert der Fog am Landschaftsbild? Da wird doch einfach nur ein Teil abgedeckt. Die Landschaft kann einfach in einer statischen Textur sein.
Bye, TGGC
-
Macht das einen direkten Unterschied? Ich muss immer noch für 500x500 Felder effizient darstellen, ob der Fog darauf liegt. Wenn das die Sache einfacher macht, kann ich natürlich die Darstellung vom Landschaftsbild und vom Nebel voneinander trennen. Und wie kann ich jetzt den Fog effizient zeichnen?
-
Schwarzes Bitmap mit nem Alphalayer?
-
Jo, Alpha Mask oder manuell Pixelweise prüfen ob das betreffende Element verdeckt ist und dann auslassen.
Auf die Textur zu rendern ist vermutlich das schnellste. Zur not kann man alle Paar Frames ein Teilstück aktualisieren. Haben die bei den ersten C&C Teilen auch so gemacht.
-
Das läuft so ungefähr auf meine bisherige Lösung
Ich habe es jetzt eine ganze Zeit lang so gemact, dass ich mit GDI auf eine Surface zeichne (über mehrere Frames) und bei jedem Frame eine zweite Surface auf den Backbuffer kopiere. Sobald die zu zeichnende Surface fertig ist, werden sie ausgetauscht. Das ist natürlich sehr affig.
hinaus. Statt das GDI zu benutzen meint ihr vermutlich was sinnvolleres. Was ist es? Transformierte Vertexe auf die Textur rendern?
-
Na einfach 4 Vertices mit ner Textur auf den Bildschirm knallen. Ich weiß jetzt nicht so was du da für Probleme hast..
-
Es sind nicht 4, das ist das Problem. Hast du den Thread-eröffnenden Post mal gelesen? Bis jetzt wurde noch nichts gesagt, was ich nicht selber schon geschrieben habe. Ich habe kein Problem insofern, dass ich es nicht auf die Reihe krieg, transformierte Vertexe zu rendern, sondern es wäre beispielsweise interessant zu wissen, ob das überhaupt eine gute Idee ist, schrittweise auf eine Textur zu rendern und die dann auf den Backbuffer. Und vor allem möchte ich wissen, ob es nicht noch eine viel bessere Möglichkeit gibt.
-
Cpp_Junky schrieb:
Auf die Textur zu rendern ist vermutlich das schnellste. Zur not kann man alle Paar Frames ein Teilstück aktualisieren. Haben die bei den ersten C&C Teilen auch so gemacht.
Klar, weil die ersten C&C Teile auch schon soviel Texturen hatten...

Also Fog dynamisch, ändern sich ehh nur'n paar Pixel pro Frame, dafür bleibt die Landschaft schnell und im VRAM drinne.
Bye, TGGC
-
Und wie genau den Fog jetzt? Als Surface auf den Backbuffer kopieren oder als Textur rendern? Wieder mit GDI malen oder locken oder auf die Textur transformierte Vertexe rendern? Oder irgendwas mit AddDirtyRectangle und UpdateTexture versuchen? Was ist denn hier am sinnvollsten?
-
Dynamische Textur.
Bye, TGGC
-
TGGC schrieb:
Cpp_Junky schrieb:
Auf die Textur zu rendern ist vermutlich das schnellste. Zur not kann man alle Paar Frames ein Teilstück aktualisieren. Haben die bei den ersten C&C Teilen auch so gemacht.
Klar, weil die ersten C&C Teile auch schon soviel Texturen hatten...

( ...)Das bezog sich auf die schrittweise Aktualisierung der Mini-Map

-
Danke erstmal an Euch. Die Minimap wird jetzt gezeichnet und wie effizient das ist, muss ich erst noch rausfinden. Auf jeden Fall ist es schon mal nicht schneckenlangsam.
-
Optimizer schrieb:
Danke erstmal an Euch.
np
Bye, TGGC
-
Um den fog of war zu realisieren könntest du es auch mit einem 2D Gitter versuchen, auf das du deine Minimap(die in einer Textur liegt) renderst. Du hast dann zum Beispiel die Möglichkeit die Farbwerte der Gitterpunkte zwischen schwarz und weiß zu färben. Dadurch bleibt Die Map dort dunkel wo man nicht hinsehen kann... Ob das gut aussieht hängt natürlich sehr von der Beschaffenheit des Gitters ab. Natürlich sollte das Gitter nicht zu fein sein. Das Gitter könnte man in einen Vertexbuffer legen, den man bei Farbänderungen neu beschreibt.
Auf Scrolling muß dann natürlich besonderes Augenmerk gelegt werden (da die Farbübergenge weich bleiben sollten.)Eine weitere Möglichkeit Geschwindigkeit herauszuholen (auf einigermaßen modernen Karten) ist folgende: Mit Hilfe des Stencilbuffers kann man es erreichen, dass statische Fenster-Elemente nur gezeichnet werden müssen, wenn sie sich verändern. Sollte deine Minimap also die restliche Grafik überdecken kannst du sie einmal in den Stencilbuffer und auf den Bildschirm rendern. Die restliche Welt wird nun mit Hilfe des Stencil-Tests nur dort gezeichnet, wo deine Minimap nich bereits liegt. Clear_Backbuffer darf dann natürlich nicht eingesetzt werden. (Insgesamt reduziert das overdraw und vermeidet aufwändige Berechnungen)
Soll deine Minimap transparent sein funktioniert das natürlich nicht.mac_bu