Рендеринг в один растровый объект из нескольких потоков - PullRequest
6 голосов
/ 16 марта 2009

Что я делаю, так это рендеринг нескольких растровых изображений в один растровый. Могут быть сотни изображений, и растровое изображение может быть размером более 1000x1000 пикселей.

Я надеюсь ускорить этот процесс, используя несколько потоков, но, поскольку объект Bitmap не является потокобезопасным, он не может быть обработан напрямую одновременно. Я думаю, что нужно разбить большое растровое изображение на разделы на процессор, визуализировать их отдельно, а затем соединить вместе в конце. Я еще этого не сделал, если у вас, ребята, есть предложения получше.

Есть идеи? Спасибо

Ответы [ 5 ]

4 голосов
/ 18 марта 2009

Вы можете использовать LockBits и работать над отдельными участками изображения.

В качестве примера того, как это делается, вы можете взглянуть на исходный код Paint.Net, особенно на BackgroundEffectsRenderer (да, это ссылка на моно ветку, но основной код Paint.Net кажется быть доступным только в zip-файлах).

1 голос
/ 16 марта 2009

Ли, если вы собираетесь использовать объект Image GDI +, вы можете просто выполнить всю работу дважды. Разделы, которые вы генерируете в нескольких потоках, нужно будет пересобрать в конце вашего подхода «разделяй и властвуй», и не противоречит ли это цели деления в первую очередь?

Эта проблема может быть решена только в том случае, если вы делаете что-то довольно сложное в каждом из разделов растрового изображения, что потребует гораздо больше времени на обработку, чем просто перерисовка вложенных частей изображения в большое растровое изображение, без каких-либо проблем.

Надеюсь, это поможет. Какой вид рендеринга изображения вы планируете?

0 голосов
/ 07 апреля 2010

Один из подходов заключается в рендеринге всех маленьких растровых изображений в растровое изображение ersatz , которое будет просто двумерным массивом int (что в любом случае является Bitmap) , Как только все маленькие растровые изображения объединены в большой массив, вы делаете одноразовую копию из большого массива в реальный Bitmap того же размера.

Я использую этот подход (не включая многопоточный аспект) все время для сложной графики на устройствах Windows Mobile, поскольку объем памяти, доступной для создания «настоящих» битовых карт GDI +, строго ограничен.

Вы также можете просто использовать Bitmap, как вы изначально планировали. Bitmap не гарантируется поточно-ориентированным, но я не уверен, что это будет проблемой, если вы можете быть уверены, что никакие два потока никогда не перезаписывают одну и ту же часть растрового изображения. Я бы попробовал, по крайней мере.

Обновление: Я только что перечитал ваш вопрос и понял, что вы, вероятно, не увидите значительного (если вообще) улучшения общей скорости этих операций, сделав их многопоточными , Это классическая проблема «девять женщин не может завести ребенка в месяц».

0 голосов
/ 16 марта 2009

Я сделал что-то похожее, и в моем случае у меня была блокировка каждого потока x (в зависимости от размера изображения и количества потоков) множества строк в изображении, и я выполнял их запись в эти биты так, ни один поток не перекрывал их записи.

0 голосов
/ 16 марта 2009

Вы можете записать каждый поток в байтовый массив, а затем, когда все они будут завершены, использовать один поток для создания растрового объекта из байтовых массивов. Если вся другая обработка была сделана заранее, это должно быть довольно быстро.

...