Tile Maps



  • Heyho,

    ich arbeite derzeit an meinem tilemap system. ist eigentlich soweit fertig, nun möchte ich allerdings noch ein wenig performance gewinnen. im moment zeichne ich meine sichtbaren tiles auf den bildschirm, und das jeden draw neu.
    nun habe ich allerdings die idee, die statischen dinge (gebirge, böden, etc, also alle dinge ohne animation und bewegung) in eine seperate texture fest zu zeichnen, sodass ich einfach nur noch eine textur anzeigen muss. würde meiner meinung nach einen dicken schub bringen, natürlich in relation dazu, wie viele statische tiles ich im mapausschnitt habe.
    macht das sinn?

    mein vorhaben bringt mich jetzt aber zu einem problem, und zwar wie bearbeite ich texturen? o.O eine textur ohne irgendwas erstellen klappt ja wunderbar, aber sie dann mit texturen zu füllen ist für mich grade noch ein mysterium. google spuckt dazu auch recht wenig brauchbares aus, also wäre ein kleiner schubs auf die richtige funktion wirklich schön 🙂

    EDIT:
    achja, vergaß zu erwähne:
    arbeite in c++ mit directx9 🙂

    mfg



  • ich pushe hier mal,

    beschreibung zu ungenau?
    oder keiner erfahrung mit?



  • Mit DirectX habe ich keine Erfahrung, aber rein vom Prinzip her könnte man sich eine Matrix anlegen, in der verzeichnet wird, an welcher Stelle welche Textur benötigt wird und dann rendert man immer die entsprechende an der jeweiligen Stelle.

    Eine große Textur aus vielen einzelnen zu "baken", halte ich für zu speicherlastig.

    Soll es denn zweidimensional (Aufsicht) oder dreidimensional sein?

    EDIT:
    Habe ich es überhaupt richtig verstanden, dass du die Texturen während der Laufzeit vereinen willst?
    Denn in dem Fall ist das rendern einzelner Tiles, wie gesagt, sehr viel effizienter.



  • Ki schrieb:

    Habe ich es überhaupt richtig verstanden, dass du die Texturen während der Laufzeit vereinen willst?
    Denn in dem Fall ist das rendern einzelner Tiles, wie gesagt, sehr viel effizienter.

    Nö, ist es nicht.

    @TE
    Google mal nach "DirectX render to texture".
    http://www.two-kings.de/tutorials/dxgraphics/dxgraphics16.html



  • cooky451 schrieb:

    Nö, ist es nicht.

    Ist ja interessant. 😃

    Ich würde gern etwas genauer aufgeklärt werden.



  • Ki schrieb:

    Ich würde gern etwas genauer aufgeklärt werden.

    Daran gibt es eigentlich nicht viel zu erklären. Rendercalls sind teuer und mit einer fertigen Textur brauchst du nur einen statt ~50.



  • cooky451 schrieb:

    Ki schrieb:

    Ich würde gern etwas genauer aufgeklärt werden.

    Daran gibt es eigentlich nicht viel zu erklären. Rendercalls sind teuer und mit einer fertigen Textur brauchst du nur einen statt ~50.

    Danke, das war mir mit OpenGL nicht bewusst. 🙂



  • wenn ich also max eine mapgröße von 1000*1000(*beliebiger tile größe) tiles wäre das zu viel?
    nochmal splitten, nach 100tiles, also das jedes bild max 100*100 tiles umfasst, oder ist ein etwa 32k-pixle *32k-pixel bild noch in ordnung? hab da wenig erfahrung mit 😛



  • Ki schrieb:

    Danke, das war mir mit OpenGL nicht bewusst. 🙂

    Das gilt auch für DirectX.

    @anti-freak:
    Die Anzahl der Tiles ist der Textur egal, wichtig ist die Größe der Textur. Ich bin mir nicht ganz sicher wie groß die bei halbwegs modernen Grafikkarten so sein dürfen und was genau DirectX garantiert. 32k*32k scheint mir allerdings schon ziemlich groß zu sein. Hast du mal daran gedacht, die Karte in verschiedene Bereiche aufzuteilen, deren statische Elemente du dann in einzelne Texturen renderst? (Das wird natürlich recht kompliziert, lohnt sich also nur, wenn du jetzt bereits Performanceprobleme bekommst. Das sollte eigentlich eine Sache sein, die man zur Not auch später noch ändern kann.)



  • cooky451 schrieb:

    @anti-freak:
    Die Anzahl der Tiles ist der Textur egal, wichtig ist die Größe der Textur. Ich bin mir nicht ganz sicher wie groß die bei halbwegs modernen Grafikkarten so sein dürfen und was genau DirectX garantiert. 32k*32k scheint mir allerdings schon ziemlich groß zu sein. Hast du mal daran gedacht, die Karte in verschiedene Bereiche aufzuteilen, deren statische Elemente du dann in einzelne Texturen renderst? (Das wird natürlich recht kompliziert, lohnt sich also nur, wenn du jetzt bereits Performanceprobleme bekommst. Das sollte eigentlich eine Sache sein, die man zur Not auch später noch ändern kann.)

    naja, performance probleme sind was anderes^^

    meine überlegung war, die map entsprechend zu splitten, also in 10*10tiles (wären dann 320*320bilder), und diese kleinen stücke dann entsprechend dem was ich anzeigen will, kurz nachzuladen. das wären dann, wenn auf dem bildschirm 20*15 tiles angezeigt werden, eine maximale speicherbelastung von 9 mal 320*320 bildern, was denke ich noch vertretbar sein sollte, und den draw prozess doch schon drastisch verschnellern würde.
    bin im moment bei 20*15tiles auf dem bildschirm zeichnen im release mode auf etwa 1-2% prozessor last (klar, auch noch weitre nebefunktionen eingeschaltet, aber das größte is der map draw), würde bei höherer auflösung aber dennoch schnell in die höhe gehen, weswegen ich dem durch diese technik gerne entgegen wirken würde.
    ich muss an für sich auch immer ein wenig an ältere grakas denken, weil ich ja nicht umsonst dx9 verwende, um eben auch pcs mit winXP oder früher noch supporten zu können. wenn ich durch diese technik dann aber den kartenspeicher sprenge, wäre das definitiv nicht in meinem interesse 🙂



  • 4096x4096 ist eine gängige Limitierung im Moment, denke ich. Das sind bei 32bit pixeln schonmal 64 Mb. Davon passen selbst auf viele moderne Grafikarten nur ein bisschen mehr als 15 (wenn man sonst nix im Ram der Grafikkarte hat).


  • Mod

    es waere vermutlich effektiver alle drawcalls in einem vertexbuffer zu vereinen, statt nur das fertige bild, so koenntest du sogar alle dynamischen dinge mit einbinden.
    du wuerdest dann vielleicht auch mit nur einer tilemap zurechtkommen, 8192x8192 sollten alle gaengigen grakas koennen und mit dxt1 hast du am ende 16MB im vram dafuer.



  • wie sieht das mit älteren grakas aus, uneingeschränkter support möglich? klingt eigentlich nach einer super möglichkeit 🙂

    ich rede mal überspitzt gesagt von 16mb onboard grafikchips in einem laptop.



  • Ich hatte mit meinem Laptop (intel hd grafikkarte) schon probleme gehabt mit zu großen bildern. Die verwendeten bilder waren dabei sogar noch etwas kleiner wenn ich das richtig in erinnerung habe.


Anmelden zum Antworten