Страница: 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 каждое ядро 
*Каждое в смысле из тех двух, которые на ввод и вывод