Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

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

 

  Вопрос: Как быстрее ставить пикселы не используя DirectX Добавлено: 03.09.08 20:10  

Автор вопроса:  
Здраствуйте!
Вопрос: как быстрее всего ставить пикселы не используя OpenGL или DirectX.
Вот то чем могу пользоваться я:
  
        For i = 0 To 499
            For j = 0 To 499
               PictureBox1.CreateGraphics.DrawLine(Pens.Black, i, j, i, j + 1)
            Next
        Next
        

Работает очень медленно.
  
        Dim bit As New Bitmap(500, 500)
        For i = 0 To 499
            For j = 0 To 499
                bit.SetPixel(i, j, Color.Black)
            Next
        Next
        PictureBox1.Image = bit

Работает раза в 2,5 быстрее, но все равно очень медленно.
Можно ускорить процес?
(пс. да и сильно ли ускорится процес если всетаки использовать OpenGL или DirectX? Много ли времени займет чтобы в этом разобраться?)

Ответить

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

Номер ответа: 1
Автор ответа:
 s12



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

Ответить

Номер ответа: 2
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #2
Добавлено: 03.09.08 22:14
http://www.codeproject.com/KB/vb/FastPixel.aspx

Ответить

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #3 Добавлено: 04.09.08 07:13
For i = 0 To 499
            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.

да и сильно ли ускорится процес если всетаки использовать OpenGL или DirectX?


Использование DirectX безусловно даст ощутимый результат потому что в этом случае будет работать аппаратное ускорение графики.

Но гемора разумеется получишь несравнимо больше чем скорости.

Много ли времени займет чтобы в этом разобраться?

Да. Простейший пример типа Hello World на DirectX занимает под сотню строк кода и понятностью совсем не отличается.
Если раньше с этим не работал, то тебе потребуется около недельки чтоб с нуля написать тот код, который ты привел в начале, на DirectX, я думаю.

Ответить

Номер ответа: 4
Автор ответа:
 Ra$cal



ICQ: 8068014 

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

Ответить

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



Разработчик

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

Ответить

Номер ответа: 6
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #6
Добавлено: 07.09.08 18:46
Использование DirectX безусловно даст ощутимый результат потому что в этом случае будет работать аппаратное ускорение графики.

сам по себе директ икс не дает аппаратного ускорения, и существенного прироста скорости. аппаратное ускорение - выполнение операций процессором видеокарты, а это делается все таки шейдерами, чтобы получить приемущество. так что фраза далека от истины, ну или как минимум не точна

Ответить

Номер ответа: 7
Автор ответа:
 Ra$cal



ICQ: 8068014 

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

Ответить

Номер ответа: 8
Автор ответа:
 



Вопросов: 1
Ответов: 4
 Профиль | | #8 Добавлено: 09.09.08 09:19
Лоховство какое-то.

Вот как надо
  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

Лень бенчмарк делать но разница думаю будет на порядок, не меньше.


А я вот сделал бенчмарк:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        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



Вопросов: 58
Ответов: 4255
 Профиль | | #9 Добавлено: 09.09.08 14:49
оба цикла выполняются одинаково долго

Этого по определению не может быть.. Потому что в твоем варианте на каждой итерации цикла создается объект Graphics, а в варианте Steel Brand этот объект создается только 1 раз а потом он просто используется.
На основании чего ты пришел к выводу что оба метода выполняются одинаково долго? Где результаты замеров? Или ты на глазок прикиинул?

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #10 Добавлено: 09.09.08 15:07
в vb6 подобный вывод работает гораздо быстрее...

ну вот только не надо тут песни петь про то как крут VB6.. плавали-знаем! Если бы ты хоть немного работал с GDI в NET ты бы знал что по умолчанию у объекта Graphics включено сглаживание и много других прибамбасов которые немного замедляют процесс отрисовки. К тому же встроенных средств в VB6 хватит лишь на вывод графических примитивов(line, cycle & etc), что с возможностями GDI+ вообще в сравнение не идет! Так что не надо тут говорить про графические убожества VB6

Ответить

Номер ответа: 11
Автор ответа:
 Ra$cal



ICQ: 8068014 

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

Ответить

Номер ответа: 12
Автор ответа:
 



Вопросов: 1
Ответов: 4
 Профиль | | #12 Добавлено: 10.09.08 08:44
Этого по определению не может быть..

А самому проверить тяжело? Скопировать код(убрать комент - он там случайно) кинуть две кнопки на форму и потыкать в них?
На основании чего ты пришел к выводу что оба метода выполняются одинаково долго? Где результаты замеров? Или ты на глазок прикиинул?


Представь себе я считал про себя - на моей машине код кнопки 1 и 2 выполнялся гдето 12 сек. (2 чуть дольше - но не существенно)

И еще раз повторяю тот код где используется using в готовом .exe работает в 1.5-2 раза дольше чем тот где юзинга нет! (а точнее сказать при постороени проэкта, код без юзинга ускорятеся, а с ним нет)

Ктонибудь - кто объясните мне и Эросу - почему так происзодит?

Ответить

Номер ответа: 13
Автор ответа:
 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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #14 Добавлено: 10.09.08 09:38
Блин, нафига сломали разделитель???

А это хоть работает?

эээ

Ответить

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



Разработчик

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

Ответить

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

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



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