2009-03-16 7 views
5

Was ist das tun Rendern einer Anzahl von Bitmaps zu einer einzelnen Bitmap. Es könnte Hunderte von Bildern geben und die Bitmap, auf die gerendert wird, könnte über 1000x1000 Pixel sein.Rendern auf ein einzelnes Bitmap-Objekt aus mehreren Threads

Ich hoffe, diesen Prozess zu beschleunigen, indem Sie mehrere Threads verwenden, aber da das Bitmap-Objekt nicht threadsicher ist, kann es nicht direkt gleichzeitig gerendert werden. Was man denkt, ist, die große Bitmap in Abschnitte pro CPU aufzuteilen, sie getrennt darzustellen und sie dann am Ende wieder zusammenzufügen. Ich habe das noch nicht gemacht, wenn ihr Jungs/Mädchen bessere Vorschläge habt.

Irgendwelche Ideen? Danke

Antwort

0

Sie könnten jeden Thread in ein Byte-Array schreiben lassen, und wenn alle fertig sind, verwenden Sie einen einzelnen Thread, um ein Bitmap-Objekt aus den Byte-Arrays zu erstellen. Wenn alle anderen Bearbeitungen vorher gemacht wurden, sollte das ziemlich schnell gehen.

1

Lee, wenn Sie das Bild GDI + -Objekt verwenden möchten, können Sie am Ende alle Arbeit zweimal tun. Die Abschnitte, die Sie in mehreren Threads generieren, müssen am Ende Ihres Divide-and-Conquer-Ansatzes wieder zusammengesetzt werden, und würde das nicht den Zweck des Teilens zunichte machen?

Dieses Problem kann nur gelöst werden, wenn Sie in jedem der Bitmap-Abschnitte etwas ziemlich Komplexes machen, das viel mehr Verarbeitungszeit erfordert, als einfach die Bildteile auf die große Bitmap neu zu zeichnen, ohne sich die Mühe zu machen.

Hoffe, dass hilft. Welche Art von Bildrendering planst du?

+0

yeah Ich dachte, dass, direkt nachdem ich gepostet habe, nichts weiter passiert außer das Zeichnen von n Bitmaps zu einem großen, fast die ganze Zeit ist in der DrawImage-Methode verbracht. Brauche eine neue Idee. –

0

Ich habe etwas ähnliches getan und in meinem Fall hatte ich jede Thread-Sperre x (abhängig von der Größe des Bildes und der Anzahl der Threads) viele Reihen von Bits in dem Bild, und schreiben sie zu diesen Bits wie dass keine Threads jemals ihre Schreibvorgänge überlappten.

4

Sie können LockBits verwenden und an einzelnen Abschnitten des Bildes arbeiten.

Für ein Beispiel, wie dies gemacht wird, können Sie den Paint.Net-Quellcode ansehen, besonders den BackgroundEffectsRenderer (ja, das ist ein Link zum Mono-Zweig, aber der Paint.Net-Hauptcode scheint nur in verfügbar zu sein Zip-Dateien).

0

Ein Ansatz wäre, all die kleinen Bitmaps auf eine ersatz Bitmap zu machen, die nur ein zweidimensionales int Array sein würde (welche Art von allem ein Bitmap wirklich ist, ist sowieso). Sobald alle kleinen Bitmaps in dem großen Array kombiniert sind, führen Sie eine einmalige Kopie aus dem großen Array in einen echten Bitmap mit den gleichen Abmessungen.

Ich benutze diesen Ansatz (ohne Multi-Thread-Aspekt) die ganze Zeit für komplexe Grafiken auf Windows Mobile-Geräten, da der verfügbare Speicher für die Erstellung "echter" GDI + Bitmaps stark begrenzt ist.

Sie könnten auch einfach eine Bitmap verwenden, wie Sie ursprünglich beabsichtigten. Bitmap ist nicht garantiert Thread-sicher, aber ich bin mir nicht sicher, dass dies ein Problem wäre, solange Sie sicherstellen können, dass keine zwei Threads jemals den gleichen Teil der Bitmap überschreiben. Ich würde es zumindest versuchen.

Update: ich gerade wieder lesen Ihre Frage, und ich erkannte, dass Sie wahrscheinlich nicht viel los, um zu sehen (falls vorhanden) Verbesserung der Gesamtgeschwindigkeit dieser Operationen, indem sie mit mehreren Threads zu machen. Es ist das klassische Neun-Frauen-kann-nicht-ein-Baby-in-einem-Monat-Problem.

Verwandte Themen