Frage

Wenn ich eine Kachel-basierter Karteneditor in C # machen, neige ich dazu, über die X, Y-Achse iterieren und rief Graphics.DrawImage () eine einzelne Kachel an Ort und Stelle blitten, von einem tileset Bitmap auf eine Karte Bitmap. Dieser Vorgang dauert einige Sekunden in Anspruch, so dass ich es nur einmal, wenn eine neue Karte oder Änderung seiner tileset geladen. Alle Änderungen, von dort sind relativ schnell blits nur die bearbeiteten Fliese.

Nun saß ich heute früher zurück und dachte über meine Möglichkeiten. Graphics.DrawImage () ist der einzige der drei (die anderen sind DrawImageUnscaled und DrawImageUnscaledAndCropped (?)), Die die Angabe eines Quellursprung ermöglicht. DrawImageUnscaled () wurde viel, viel schneller, aber immer Blitted von der oberen linken Ecke des Quell-Bitmap.

In scharfem Kontrast zu den Geschwindigkeiten von Quickbasic PSET gegen POKEing des Videospeicher oder VB6 der PSet gegen WinAPI der SetPixel, eine einfache Get / SetPixel Schleife war so schnell wie ein DrawImageUnscaled Anruf , sondern tat das Zuschneiden dass nur DrawImage sonst tun.

Das ist schnell genug für jetzt, aber ich frage mich, wie so etwas wie direkte Bildmanipulation es bis beschleunigen könnte noch mehr? Etwas mit LockBits vielleicht eine Funktion Ich weiß so gut wie nichts über?

War es hilfreich?

Lösung

Es gibt eine ausgezeichnete Antwort auf diese auf .. Wie zu manipulieren Bilder auf Pixelebene in C #

Wenn Sie den LockBits Weg gehen tun könnten Sie ein Follow-up mit den Geschwindigkeitsdifferenzen stellen.

Andere Tipps

Software blitting scheint wie ein schwerer Engpass. Ich würde Blick in Hardware ernsthaft vorschlagen, beschleunigt wie dies für eine Aufgabe zu ziehen.

  

eine einfache Get / SetPixel Schleife war so schnell   als DrawImageUnscaled Anruf

Dann sind Sie auf jeden Fall etwas falsch zu machen. Die GetPixel und SetPixel Methoden hat einige ziemlich Overhead, einem der DrawImage Methoden sollte wie 100-mal somehting schneller (es sei denn vielleicht, wenn Sie Ihre Fliesen sehr klein sind, wie 2x2 Pixel).

Im Gegensatz zu seinem Namen, die DrawImageUnscaled Methode zieht nicht ohne Ändern der Größe. Stattdessen verwendet es die PPI Einstellungen der Bilder, um sie zu den gleichen Messungen zu skalieren. Das bedeutet, dass, wenn Sie eine Bitmap mit der Einstellung 100 PPI haben, und ziehen auf eine Bitmap mit der Einstellung 50 PPI, wird es auf die doppelte Größe der Größe verändert werden.

Wenn Sie die Bilder bei unveränderter Größe zeichnen, können Sie die Qualitätseinstellungen im Graphics Objekt ändern, um die Geschwindigkeit zu optimieren. Sie können zum Beispiel die InterpolationMode Eigenschaft auf NearestNeighbor, damit er nicht jede Interpolation zu tun.

Eine Alternative auf der Bitmap zu zeichnen sei LockBits und UnlockBits zu verwenden, um Zugriff auf die Bitmap-Pixeldaten zu erhalten direkt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top