Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 | 3 |

 

  Вопрос: Параллельный ParallelBitmap Добавлено: 25.02.11 21:04  

Автор вопроса:  VβÐUηìt | Web-сайт: смекаешь.рф

Ответить

  Ответы Всего ответов: 38  

Номер ответа: 16
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #16
Добавлено: 28.02.11 17:01
Объект Bitmap - это хрень всякая (палитра, битс пер пиксел, ширина, высота и др), и ссылка на первый байт памяти, где хранится картинка. То есть мы можем создать другой объект, сделать ему те же параметры, и ту же ссылку на память. В итоге - объекта два, память одна. Так то.

Ответить

Номер ответа: 17
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #17 Добавлено: 28.02.11 17:42
ну даже в таком случае полюбому придется иметь иснхронизацию. иначе если один поток будет рисовать одну картинку а второй другую, то в том месте, где картинки пересекаются, не будет ожидаемого результата. а чтение всей картинки будет не атомарным, и картинка будет растянута по времени, если вдруг при чтении на ней кто-то что то ирсовал

Ответить

Номер ответа: 18
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #18
Добавлено: 28.02.11 18:17
AgentFire пишет:
иначе если один поток будет рисовать одну картинку а второй другую, то в том месте, где картинки пересекаются

Пофигу. Мне как раз это и нужно. Просто буду в разных местах рисовать.

Ответить

Номер ответа: 19
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #19 Добавлено: 28.02.11 19:54
Я бы советовал для начала провести бенчмарк, а именно - модификация разных битмапов в разных потоках.

Ответить

Номер ответа: 20
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #20 Добавлено: 28.02.11 20:39
VβÐUηìt пишет:
Просто буду в разных местах рисовать.

А чтение? И вообще зачем тебе это все?

Ответить

Номер ответа: 21
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #21
Добавлено: 28.02.11 21:22
Задача на двумегапиксельном FullHD 120 (!) раз в секунду рисовать разную лабуду в разных местах этого битмапа. Лабуда может тоже быть большой. Поэтому последовательно рисовать какбэ неэффективно. WPF отпадает, ибо это все надо еще потом в фильтр DirectShow в конечном итоге сувать. А насчет считывания, тут да. Но как: мы сначала параллельно рисуем N всякой херни, ждем пока все дорисуется и затем читаем результат. Как-то так.

Ответить

Номер ответа: 22
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #22 Добавлено: 01.03.11 00:39
Объект Bitmap - это хрень всякая (палитра, битс пер пиксел, ширина, высота и др), и ссылка на первый байт памяти, где хранится картинка.

Блин, ну так я тебе про тоже и писал, что тебе надо юзать Scan0 + unsafe. Это и есть указатель на первый байт.
То есть мы можем создать другой объект, сделать ему те же параметры, и ту же ссылку на память. В итоге - объекта два, память одна

А вот тут ты, имхо, заблуждаешься.. Перед вызовом Scan0(для получения указателя) тебе надо лочить кусок памяти вызывая LockBitmap. И 2 раза залочить одну и ту же память у тебя нифига не выйдет это раз. Во вторых быстрее, чем доступ по указателю к RGB еще ничего не придумализ. Во третьих даже если ты замутишь 2 битмапа с 1 памятью(каким то образом), то при попытке записи туда из 2 и более потоков наверняка схлопочешь что то типа CrossThreadException или, что чаще всего - Unknown GDI error...

Ответить

Номер ответа: 23
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #23
Добавлено: 01.03.11 12:30
Посмотрим... А насчет локов - пусь будут, суть в том, чтобы лок не длился все время выполнения графической операции.

Ответить

Номер ответа: 24
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #24 Добавлено: 01.03.11 12:50
VBD, потрудись погуглить или сделать бенчмарк. На forums.msdn.* намедни читал что внутри GDI+ стоит синхронизация и при работе с двух потоков с одним битмапом получилось чуть ли не в 2 раза медленнее было чем делать то же одним потоком.

Ответить

Номер ответа: 25
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #25
Добавлено: 01.03.11 14:22
Artyom пишет:
при работе с двух потоков с одним битмапом получилось чуть ли не в 2 раза медленнее было чем делать то же одним потоком.

C одним битмапом. А тут их будет два. Какбэ.

Ответить

Номер ответа: 26
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #26 Добавлено: 01.03.11 14:40
сколько у тебя сейчас тратится времени на 1 битмап?

Ответить

Номер ответа: 27
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #27
Добавлено: 01.03.11 14:41
50 мс

Ответить

Номер ответа: 28
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #28 Добавлено: 01.03.11 16:37
Это 20 FPS. Для получения 120 FPS тебе будет нужен как минимум 6-ядерный процессор (при условии что скорость будет повышаться пропорционально увеличению кол-ва ядер, чего, кстати, не будет).

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

Ответить

Номер ответа: 29
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #29
Добавлено: 01.03.11 19:33
Картинки одновременно нельзя, ибо реалтайм. Там стоит кластер с 8 ядерным ксеоном и HyperThreading, то есть виртуальных ядер - 16. Ресурсов до жопы. Фигня в том, что:
1) Грузятся только 3
2) Из них два уходит на ввод и вывод видео
3) Одно на наложение. Полностью.
-----
16 ядер - из них используется 3. Два ядра нагружены нормально, а вот то, которе с наложением - не справляется. Без наложения работает пулей, грузит по ~2/3 каждое ядро. Ввод и вывод видео распраллелить нельзя, поэтому нужно распараллелить.
-----
Несколько картинок одновременно генерить нельзя, ибо реалтайм. А если я буду накапливать их в очередь, будет задержка. И все обидятся :) В общем нужно распараллелить Bitmap.

Ответить

Номер ответа: 30
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #30
Добавлено: 01.03.11 19:34
VβÐUηìt пишет:
 пулей, грузит по ~2/3 каждое ядро

*Каждое в смысле из тех двух, которые на ввод и вывод

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам