Страница: 1 | 2 | 
		
		 
			   
			 
			 
			 
			 
			
 
  
		
     
  
    
Вопрос: Как быстрее ставить пикселы не используя DirectX 
     
    
Добавлено: 03.09.08 20:10
     
      
  
				
			  
					 
			
				 
				
		
		
					 
			
				 
  
		
     
  
    
Ответы
     
    
Всего ответов: 27
     
      
  
		
	  
			 
	
		 
    
       
    
Номер ответа: 1 
      
Автор ответа: s12
 s12




Вопросов: 24
Ответов: 363
      
 Профиль |  | #1
       
Добавлено:  03.09.08 21:05
       
    
       
  
Насчет дотнета незнаю, но про работу с графикой а-ля DirectX посмотри здесь: 
 
    
http://netlib.narod.ru/
		
	  
			 
	
		 
    
       
    
Номер ответа: 2 
      
Автор ответа: Skywalker
 Skywalker






ICQ: 300-70-6пятьЪ 
Вопросов: 62
Ответов: 545
      
 Web-сайт:  
 Профиль |  | #2
      
Добавлено:  03.09.08 22:14
       
    
       
  
http://www.codeproject.com/KB/vb/FastPixel.aspx
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 3 
      
Автор ответа: Artyom
 Artyom







Разработчик
Вопросов: 130
Ответов: 6602
      
 Профиль |  | #3
       
Добавлено:  04.09.08 07:13
       
    
       
  
 
    
            For j = 0 To 499 
               PictureBox1.CreateGraphics.DrawLine(Pens.Black, i, j, i, j + 1) 
            Next 
        Next
Лоховство какое-то.
Вот как надо
    Using GR = PictureBox1.CreateGraphics
        For i = 0 To 499 
            For j = 0 To 499 
               GR.DrawLine(Pens.Black, i, j, i, j + 1) 
            Next 
        Next
    End Using
Лень бенчмарк делать но разница думаю будет на порядок, не меньше.
Если хочется больше скорости, можно работать не через GDI, а с бинарным массивом, потом перегнать в Bitmap и на Graphics.
Использование DirectX безусловно даст ощутимый результат потому что в этом случае будет работать аппаратное ускорение графики.
Но гемора разумеется получишь несравнимо больше чем скорости.
Да. Простейший пример типа Hello World на DirectX занимает под сотню строк кода и понятностью совсем не отличается.
Если раньше с этим не работал, то тебе потребуется около недельки чтоб с нуля написать тот код, который ты привел в начале, на DirectX, я думаю.
		
	  
			 
	
		 
    
       
    
Номер ответа: 4 
      
Автор ответа: Ra$cal
 Ra$cal








ICQ: 8068014 
Вопросов: 18
Ответов: 817
      
 Web-сайт:  
 Профиль |  | #4
      
Добавлено:  06.09.08 20:02
       
    
       
  
потому что в этом случае будет работать аппаратное ускорение графики. 
 
    
бред. ускорение работает только если ты напишешь код рисования шейдером. все тормоза от работы графической подсистемы вендоф. локинг битов, получение, запись, анлокинг. при этом идет куча системных вызовов. у дикс в этом смысле плюс, что он работает с видеопамятью и требует меньше вызовов системных функций.
ну а в венде быстрее всего работать с картинкой через DIB, получая массив байтов изображения функцией GetDIBBits и меняя его напрямую.
		
	  
			 
	
		 
    
       
    
Номер ответа: 5 
      
Автор ответа: Artyom
 Artyom







Разработчик
Вопросов: 130
Ответов: 6602
      
 Профиль |  | #5
       
Добавлено:  07.09.08 05:30
       
    
       
  
Ну и каким образом это противоречит тому что я сказал?
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 6 
      
Автор ответа: Ra$cal
 Ra$cal








ICQ: 8068014 
Вопросов: 18
Ответов: 817
      
 Web-сайт:  
 Профиль |  | #6
      
Добавлено:  07.09.08 18:46
       
    
       
  
 
    
сам по себе директ икс не дает аппаратного ускорения, и существенного прироста скорости. аппаратное ускорение - выполнение операций процессором видеокарты, а это делается все таки шейдерами, чтобы получить приемущество. так что фраза далека от истины, ну или как минимум не точна
		
	  
			 
	
		 
    
       
    
Номер ответа: 7 
      
Автор ответа: Ra$cal
 Ra$cal








ICQ: 8068014 
Вопросов: 18
Ответов: 817
      
 Web-сайт:  
 Профиль |  | #7
      
Добавлено:  08.09.08 02:01
       
    
       
  
я просто писал 2д игрушку на плюсах и DirectDraw. Делал попиксельный колижндетекшн. Суть его была проста - лочились сюрфейсы, пересекались ректанглы, дальше в общей области считывались байты цветов, и в цикле шла проверка на колоркей фона, типа если пересеклись прямоугольники с картинками, но пересеклись цветами прозрачности, то значит это не то столкновение. нужно чтоб столкнулись реальные цвета, отражаемые. Так вот к чему это. Проверялись цвета как - обычным фором. Как итог - когда сближались объекты в спрайтах, начинался забавный артефакт - как будто время замедляется, ибо отрисовка делалась по dT фрейма, а с фиксированным шагом. И это не смотря на то, что работа шла напрямую с пикселами. А все потому, что с пикселами работал таки центральный процессор  
     
Надеюсь спор на этом закончится.
		
	  
			 
	
		 
    
       
    
Номер ответа: 8 
      
Автор ответа: 
 




Вопросов: 1
Ответов: 4
      
 Профиль |  | #8
       
Добавлено:  09.09.08 09:19
       
    
       
  
 
    
Вот как надо
        For i = 0 To 499 
            For j = 0 To 499 
               GR.DrawLine(Pens.Black, i, j, i, j + 1) 
            Next 
        Next 
    End Using
Лень бенчмарк делать но разница думаю будет на порядок, не меньше.
А я вот сделал бенчмарк:
        Dim i As Integer
        For i = 0 To 100000
            Me.CreateGraphics.DrawLine(Pens.Black, 0, 0, 100, 100)
        Next
Me.CreateGraphics.DrawLine(Pens.Coral, 0, 0, 100, 100)
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim i As Integer
        Using gr = Me.CreateGraphics
            For i = 0 To 100000
                '  gr.DrawLine(Pens.Black, 0, 0, 100, 100)
            Next
            gr.DrawLine(Pens.Coral, 0, 0, 100, 100)
        End Using
    End Sub
и пришол к выводу что пока не построиш проект оба цикла выполняются одинаково долго.
А вот когда построиш проэкт тот цикл где using не используется выполняется в полтора раза быстрее, а тот где используется все так же долго...
как вас было понимать.. я чтото не так сделал?
да и еще - в vb6 подобный вывод работает гораздо быстрее...
		
	  
			 
	
		 
    
       
    
Номер ответа: 9 
      
Автор ответа: EROS
 EROS




Вопросов: 58
Ответов: 4255
 Профиль |  | #9
       
Добавлено:  09.09.08 14:49
       
    
       
  
 
    
Этого по определению не может быть.. Потому что в твоем варианте на каждой итерации цикла создается объект Graphics, а в варианте Steel Brand этот объект создается только 1 раз а потом он просто используется.
На основании чего ты пришел к выводу что оба метода выполняются одинаково долго? Где результаты замеров? Или ты на глазок прикиинул?
		
	  
			 
	
		 
    
       
    
Номер ответа: 10 
      
Автор ответа: EROS
 EROS




Вопросов: 58
Ответов: 4255
 Профиль |  | #10
       
Добавлено:  09.09.08 15:07
       
    
       
  
 
    
ну вот только не надо тут песни петь про то как крут VB6.. плавали-знаем! Если бы ты хоть немного работал с GDI в NET ты бы знал что по умолчанию у объекта Graphics включено сглаживание и много других прибамбасов которые немного замедляют процесс отрисовки. К тому же встроенных средств в VB6 хватит лишь на вывод графических примитивов(line, cycle & etc), что с возможностями GDI+ вообще в сравнение не идет! Так что не надо тут говорить про графические убожества VB6
		
	  
			 
	
		 
    
       
    
Номер ответа: 11 
      
Автор ответа: Ra$cal
 Ra$cal








ICQ: 8068014 
Вопросов: 18
Ответов: 817
      
 Web-сайт:  
 Профиль |  | #11
      
Добавлено:  09.09.08 17:11
       
    
       
  
 
     кто запрещает в вб6 подключить GDI+ ? Я в плюсах частенько рисую с GDI+ например, все достаточно шустро.
 кто запрещает в вб6 подключить GDI+ ? Я в плюсах частенько рисую с GDI+ например, все достаточно шустро.
		
	  
			 
	
		 
    
       
    
Номер ответа: 12 
      
Автор ответа: 
 




Вопросов: 1
Ответов: 4
      
 Профиль |  | #12
       
Добавлено:  10.09.08 08:44
       
    
       
  
 
    
А самому проверить тяжело? Скопировать код(убрать комент - он там случайно) кинуть две кнопки на форму и потыкать в них?
Представь себе я считал про себя - на моей машине код кнопки 1 и 2 выполнялся гдето 12 сек. (2 чуть дольше - но не существенно)
И еще раз повторяю тот код где используется using в готовом .exe работает в 1.5-2 раза дольше чем тот где юзинга нет! (а точнее сказать при постороени проэкта, код без юзинга ускорятеся, а с ним нет) 
Ктонибудь - кто объясните мне и Эросу - почему так происзодит?
		
	  
			 
	
		 
    
       
    
Номер ответа: 13 
      
Автор ответа: Artyom
 Artyom







Разработчик
Вопросов: 130
Ответов: 6602
      
 Профиль |  | #13
       
Добавлено:  10.09.08 09:37
       
    
       
  
"где-то 12 сек" - эта пяць конечно.
 
    
Объяснять тебе с твоим уровнем знаний по сути нечего, ты где-то очень сильно накосячил и не можешь понять где.
Проверил я. Мои предположения о разнице на порядке, увы, оказались неверными. Но разница все равно есть и мой код выигрывает почти 20% (14 против 11 секунд).
В Debug и Release разницы практически нет.
К слову не понятно что имеется в виду под "построением проекта"? Расскажи нам как ты умудряешься запускать проект без построения проекта.
Один ощутимый недостаток твоего кода - в нем создается 10 000 лишних объектов Graphics (которые, хотя и ссылаются на один и тот же физический Graphics Device Context, все равно являются разными объектами, и соответсвенно нагрузят менеджер памяти. Плюс этот самый device context будет висеть до тех пор пока сборщик мусора не обработает все твои повисшие Graphics'ы а это уже фактически утечка неуправляемых ресурсов.
VB6 сам по себе - ходячее недоразумение  
Поищи, если интересно, был тут недавно challenge, так код на Vb6 "отсосал" у Vb .NET то ли в разы, то ли на порядки  Вобщем весело было
 Вобщем весело было  
		
	  
			 
	
		 
    
       
    
Номер ответа: 14 
      
Автор ответа: Artyom
 Artyom







Разработчик
Вопросов: 130
Ответов: 6602
      
 Профиль |  | #14
       
Добавлено:  10.09.08 09:38
       
    
       
  
Блин, нафига сломали разделитель???
 
    
А это хоть работает?
эээ
		
	  
			 
	
		 
    
       
    
Номер ответа: 15 
      
Автор ответа: Artyom
 Artyom







Разработчик
Вопросов: 130
Ответов: 6602
      
 Профиль |  | #15
       
Добавлено:  10.09.08 09:38
       
    
       
  
фух, слава богу...