2009-03-16 12 views
5

Ciò che sta facendo è il rendering di un numero di bitmap in una singola bitmap. Potrebbero esserci centinaia di immagini e la bitmap in fase di rendering potrebbe essere superiore a 1000x1000 pixel.Rendering su un singolo oggetto Bitmap da più thread

Nella speranza di velocizzare questo processo utilizzando più thread ma poiché l'oggetto Bitmap non è thread-safe non può essere reso direttamente in modo concorrente. Quello che penso è dividere la grande bitmap in sezioni per CPU, renderle separatamente, quindi unirle di nuovo insieme alla fine. Non l'ho ancora fatto, ma voi ragazzi/ragazze avete qualche suggerimento migliore.

Qualche idea? Grazie

risposta

0

Si potrebbe avere ogni thread scrivere in un array di byte, quindi quando tutti sono finiti, utilizzare un singolo thread per creare un oggetto bitmap dagli array di byte. Se tutte le altre elaborazioni sono state fatte prima, dovrebbe essere abbastanza veloce.

1

Lee, se hai intenzione di usare l'oggetto Image GDI +, potresti finire a fare tutto il lavoro due volte. Le sezioni generate in più thread dovranno essere riassemblate alla fine del tuo approccio divide et impera e non riuscirebbero a sconfiggere lo scopo della divisione in primo luogo?

Questo problema potrebbe essere risolto solo se si sta facendo qualcosa di piuttosto complesso in ciascuna delle sezioni bitmap che sarebbe molto più tempo di elaborazione rispetto al semplice ridisegnare le sottoparti dell'immagine sulla bitmap grande senza andare a tutti quei problemi.

Spero che questo aiuti. Che tipo di rendering di immagini stai pianificando?

+0

sì, ho pensato che subito dopo aver postato, non c'è nulla di più in corso a parte il disegnare n bitmap in uno grande, quasi tutto il tempo speso è nel metodo DrawImage. Hai bisogno di una nuova idea. –

0

Ho fatto qualcosa di simile e nel mio caso ho avuto ogni blocco di thread x (dipendeva dalla dimensione dell'immagine e il numero di thread) molte righe di bit nell'immagine, e fanno la loro scrittura su quei bit tali che nessun filo ha mai sovrapposto le loro scritture.

4

È possibile utilizzare LockBits e lavorare su singole sezioni dell'immagine.

Per un esempio di come è possibile eseguire il codice sorgente Paint.Net, in particolare lo BackgroundEffectsRenderer (sì, questo è un collegamento al ramo mono, ma il codice principale Paint.Net sembra essere disponibile solo in file zip).

0

Un approccio sarebbe di rendere tutti i piccoli bitmap su un surrogato bitmap , che sarebbe solo un bidimensionale int array (che è di tipo complesso un Bitmap è davvero comunque). Una volta che tutti i bitmap piccoli vengono combinati nel grande array, si esegue una singola copia dal grande array in un vero Bitmap delle stesse dimensioni.

Io uso questo approccio (escluso l'aspetto multi-thread) sempre per grafica complessa su dispositivi Windows Mobile, poiché la memoria disponibile per la creazione di bitmap GDI + "reali" è fortemente limitata.

Si potrebbe anche solo utilizzare uno Bitmap come originariamente previsto. Bitmap non è garantito per essere thread-safe, ma non sono sicuro che sarebbe un problema finché si può assicurare che non ci siano mai due thread che sovrascrivono la stessa porzione della bitmap. Ci proverei, almeno.

Aggiornamento: Ho appena riletto la tua domanda e mi sono reso conto che probabilmente non vedrai molti (se nessuno) miglioramenti nella velocità complessiva di queste operazioni rendendoli multi-thread. È il classico problema delle nove donne-non-fai-un-bambino-in-un-mese.

Problemi correlati