PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Voxelengine - Speicher zu langsam


ProgT
2005-02-12, 19:44:31
Hallo zusammen!

Zum Hintergrund meine Frage:
Ich bastle zur Zeit an einer älteren Voxel-Engine von mir rum. Dabei werden Strahlen über eine Heightmap[ein Array aus 8 Bit Höhenwerten] geschossen, um so die Landschaft zu zeichnen. Pro Bildschirmspalte ein Ray, also bei 640x480 sind das 480 Rays.
Im Prinzip ist das das gleiche Verfahren wie bei Outcast.

Zum Problem: :(
Wegen dieser Rays zeichne ich die einzelnen Pixel natürlich von unten nach oben in den Framebuffer, denn der Ray startet bei der Kamera und läuft bis zu einer gewissen Entfernung(da ist dann Nebel).
Jetzt muss ich natürlich bei jedem Pixel den ich zeichne eine Bildschirmzeile übersprigen, dass macht bei 640x480 pro Zeile 640*8 Bytes (4 Byte Farbe und 4 Byte ZBuffer). Das ist aber saulahm. Es liegt scheint wirklich daran zu liegen, dass ich jedes mal so viel Speicher überspringe.
Seit kurzem verwende ich den SSE-Befehl movntq um die Pixel zuschreiben, was viel schneller ist, weil der Cache umgangen wird. Jedenfalls habe ich das so verstanden.
Trotzdem braucht das immer noch viel zu viel Zeit, denn wenn ich nur den Befehl movntq auskommentiere und alle Berechnungen drinlasse, gehen die FPS um bis zu 50(!) Prozent nach oben.

Also an die Experten:
Wie kann ich schneller in den Speicher schreiben?

Thx

RLZ
2005-02-12, 20:11:22
Ich versteh nicht ganz was du da machst.
Du musst doch beim Tracen durch ne Heightmap nur das Endergebnis speichern.
Wenn dir das zu langsam ist leg einfach ne Beschleunigerstruktur drüber.

Coda
2005-02-13, 00:44:41
Schreibst du denn direkt in den Videospeicher? Das würde ich bleiben lassen.

micki
2005-02-13, 12:37:01
je nachdem wie du das mit movntq machst kann es sein, dass weil du den schreibbefehl auskommentierst, der compiler auch einige befehle die du davor benutzt weglässt, weil er weis, dass das ergebnis von denen nicht gebraucht wird.

was du machen könntest, wäre vielleicht prefetch befehle benutzen für das cachen vom lesen aus deiner heightmap.

du könntest auch versuchen das terrain in mehrere "mipmaps" zu unterteilen, sodass du ab einer gewissen entfernung in einer kleineren map traced, das würde dann eventuell mehr cachehits bedeuten.

was ich mal gemacht habe, ist eine nur 64*64 map zu nehmen und sie wie bei perlin noise zu filtern, sodass ich eine viel größere map damit simulieren konnte, das war auf meinem K6-200 aber genau so fix wie das direkte lesen. heutzutage könnte das schneller sein :)

MfG
micki