Страница: 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
иначе если один поток будет рисовать одну картинку а второй другую, то в том месте, где картинки пересекаются
Пофигу. Мне как раз это и нужно. Просто буду в разных местах рисовать.
Номер ответа: 19
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #19
Добавлено: 28.02.11 19:54
Я бы советовал для начала провести бенчмарк, а именно - модификация разных битмапов в разных потоках.
Номер ответа: 20
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #20
Добавлено: 28.02.11 20:39
Просто буду в разных местах рисовать.
А чтение? И вообще зачем тебе это все?
Номер ответа: 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
Блин, ну так я тебе про тоже и писал, что тебе надо юзать 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
при работе с двух потоков с одним битмапом получилось чуть ли не в 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
пулей, грузит по ~2/3 каждое ядро
*Каждое в смысле из тех двух, которые на ввод и вывод