Tileset Packer: Details zum Code

Wie versprochen gibt es jetzt ein paar Details zum Code des Tileset Packers. Das Programm hat (meiner Meinung nach) ein paar interessante Stellen, die dem einen oder anderen .Net-Coder bestimmt helfen können.

Im Grunde hat der Packer drei Probleme zu lösen:

  1. Das Tileset muss verschnitten werden
  2. Doppelte Tiles müssen aussortiert werden
  3. Das Tileset muss effektiv wieder zusammen gesetzt werden

Dazu sollte das Programm natürlich eine gewisse Geschwindigkeit an den Tag legen. Das verschneiden kann man relativ einfach mit Bitmap.Clone erledigen, doch das ist sehr langsam, und dazu nimmt die Geschwindigkeit auch noch mit zunehmender Größe der Bitmap ab. (Große Bitmap = langsamer Code). Es musste also eine Alternative her. Durch einen Tipp in einem Forum bin ich dann auf Bitmap.LockBits gestoßen, eine Methode die direkt (unsafe) auf die Bitmap zugreift und dadurch sehr schnell ist. Von dieser Methode bekommt man ein BitmapData Objekt, mit dem man über einen Pointer auf die Daten im Arbeitsspeicher zugreifen kann.

Diese Daten verwendet dann die Methode GetHash, die aus den Bitmapdaten einen Hash generiert, mit dem doppelte Tiles aussortiert werden können.

Weiterlesen

.NET Tipps Teil 3

Ich hab ja schon ewig keine Tipps mehr zu .NET gegeben, da wird es ja mal wieder Zeit für eine neue „Folge“ 😉

Diesmal ist es nicht direkt ein Tipp, sondern mehr ein Hinweis:

Bei Bitmap.Clone(Rectangle, PixelFormat) ist eine OutOfMemoryException nicht, was man denkt!

Diese Tatsache wird zwar auch in der Dokumentation erwähnt, aber es hat mich jetzt schon zweimal fast zur Verzweiflung getrieben. Bitmap.Clone() verursacht eine OutOfMemoryException, wenn das Rectangle außerhalb der Bitmap liegt. Dann ist das Rectangle zwar auch „außerhalb des Speichers“, aber trotzdem ist das sehr unglücklich gewählt. Zudem zeigt das VisualStudio dann auch noch „Nicht genügend Abeitsspeicher“ an. Das ist natürlich schlichtweg falsch!

Also nicht verzweifeln, sondern das Rectangle noch mal überprüfen 😀

Weiterlesen