Wenn ich einen Kachel-basierten Karteneditor in C# mache, tendiere ich dazu, über die X-, Y-Achsen zu iterieren und Graphics.DrawImage() aufzurufen, um eine einzelne Kachel von einer Kachel-Bitmap auf eine Karten-Bitmap zu setzen. Dieser Vorgang dauert einige Sekunden. Ich mache das also nur einmal, wenn ich eine neue Map lade oder das Tileset ändere. Alle Bearbeitungen von dort sind relativ schnelle Blitze nur der bearbeiteten Kachel.Könnte dieser Fliesenblitter schneller werden?
Jetzt saß ich heute früher zurück und dachte über meine Möglichkeiten nach. Graphics.DrawImage() ist das einzige von den dreien (die anderen sind DrawImageUnscaled und DrawImageUnscaledAndCropped (?)), Die die Spezifikation eines Quellursprungs ermöglichen. DrawImageUnscaled() war viel, viel schneller, aber immer von der oberen linken Ecke der Quell-Bitmap geblisted.
In scharfem Kontrast zu den Geschwindigkeiten von Quickbasic PSET gegen POKEing des Videospeicher oder VB6 der PSet gegen WinAPI des SetPixel, eine einfache Get/SetPixel Schleife war so schnell wie ein DrawImageUnscaled Anruf, aber das Zuschneiden tat das nur DrawImage würde sonst tun.
Das ist schnell genug für jetzt, aber ich frage mich, wie etwas wie direkte Bildbearbeitung es noch mehr beschleunigen könnte? Etwas mit LockBits vielleicht, eine Funktion, über die ich so gut wie nichts weiß?
Dies ist nicht wirklich die Antwort auf Ihre Frage, aber Sie können die Geschwindigkeit des DrawImage erhöhen, indem Sie das gesamte Rechteck des Bildes definieren -> X, Y, Width, Height. In meinem Test erreichte ich eine Beschleunigung von ca. 20%. –