Страница: 1 | 2 |
Вопрос: Как быстрее ставить пикселы не используя DirectX
Добавлено: 03.09.08 20:10
Ответы
Всего ответов: 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-сайт:
Профиль | | #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 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
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #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-сайт:
Профиль | | #6
Добавлено: 07.09.08 18:46
сам по себе директ икс не дает аппаратного ускорения, и существенного прироста скорости. аппаратное ускорение - выполнение операций процессором видеокарты, а это делается все таки шейдерами, чтобы получить приемущество. так что фраза далека от истины, ну или как минимум не точна
Номер ответа: 7
Автор ответа:
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
Вопросов: 58
Ответов: 4255
Профиль | | #9
Добавлено: 09.09.08 14:49
Этого по определению не может быть.. Потому что в твоем варианте на каждой итерации цикла создается объект Graphics, а в варианте Steel Brand этот объект создается только 1 раз а потом он просто используется.
На основании чего ты пришел к выводу что оба метода выполняются одинаково долго? Где результаты замеров? Или ты на глазок прикиинул?
Номер ответа: 10
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #10
Добавлено: 09.09.08 15:07
ну вот только не надо тут песни петь про то как крут VB6.. плавали-знаем! Если бы ты хоть немного работал с GDI в NET ты бы знал что по умолчанию у объекта Graphics включено сглаживание и много других прибамбасов которые немного замедляют процесс отрисовки. К тому же встроенных средств в VB6 хватит лишь на вывод графических примитивов(line, cycle & etc), что с возможностями GDI+ вообще в сравнение не идет! Так что не надо тут говорить про графические убожества VB6
Номер ответа: 11
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #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
фух, слава богу...