Страница: 1 |
Страница: 1 |
Вопрос: CopyMemory vs For..Next
Добавлено: 07.06.06 12:52
Автор вопроса: Victor | Web-сайт:
Что быстрее:
ByRef Bitmap As vtBitmap, _
ByVal x As Long, _
ByVal y As Long)
Dim xf As Long, yf As Long
Dim xt As Long, yt As Long
Dim tx As Long, ty As Long
Dim w As Long, h As Long
w = Bitmap.w
h = Bitmap.h
xf = 0
yf = 0
xt = w - 1
yt = h - 1
If xf + x < 0 Then xf = 0 - x
If yf + y < 0 Then yf = 0 - y
If xt + x > DIB.w - 1 Then xt = DIB.w - 1 - x
If yt + y > DIB.h - 1 Then yt = DIB.h - 1 - y
If xf > xt Then Exit Sub
For ty = yf To yt
CopyMemory DIB.Data(x + xf, y + ty), Bitmap.Data(xf, ty), 4& * (xt - xf + 1)
Next ty
End Sub
For ty = yf To yt
For tx = xf To xt
DIB.Data(x + tx, y + ty) = Bitmap.Data(tx, ty)
Next tx
Next ty
Опыт показывает, что на глаз в откомпилированном варианте со всеми оптимизаторами быстрее For..Next. Это применяется на достаточно маленьких битмапах (32x32), но битмапов много и они мозаикой покрывают полэкрана.
Объясните мне, почему это так??? Неужели API-шка хуже VB???
Ну и вообще. Как это сделать еще быстрее?
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #1
Добавлено: 07.06.06 13:15
Неужели API-шка хуже VB???
А где ты видишь хоть одну встроеную VB-функцию в теле цикла??? Только непосредственная запись в память (массив).
CopyMemory DIB.Data(x + xf, y + ty), Bitmap.Data(xf, ty), 4& * (xt - xf + 1)
Зачем на каждом проходе вычислять 4& * (xt - xf + 1)?
Вынеси за цикл и сохрани результат в переменной.
Номер ответа: 2
Автор ответа:
Victor
ICQ: 345743490
Вопросов: 42
Ответов: 385
Web-сайт:
Профиль | | #2
Добавлено: 07.06.06 13:25
Ха. Логично. Ща проверю.
Номер ответа: 3
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #3
Добавлено: 07.06.06 13:30
If xf + x < 0 Then xf = 0 - x
If yf + y < 0 Then yf = 0 - y
наверное так будет грамотнее:
If x < 0 Then xf = xf - x
If y < 0 Then yf = yf - y
Номер ответа: 4
Автор ответа:
Victor
ICQ: 345743490
Вопросов: 42
Ответов: 385
Web-сайт:
Профиль | | #4
Добавлено: 07.06.06 13:41
Забавно.
Не поленился, сделал замер.
С CopyMemory работает быстрее. Причем в 3 раза.
Мда..
Может по тому, что на другом компе. Может, просто тогда, когда я это смотрел, fps от VB попал в частоту монитора и по этому смотрелся глаже.
Получилось: vb: 110fps, API: 300fps
Приду домой, переизмерю. Интересно.
Номер ответа: 5
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #5
Добавлено: 07.06.06 16:25
На новых процах Copymemory заоптимизировали.
Номер ответа: 6
Автор ответа:
Victor
ICQ: 345743490
Вопросов: 42
Ответов: 385
Web-сайт:
Профиль | | #6
Добавлено: 07.06.06 17:00
Протестил на проце 200mhz.
VB: ~30fps
API: ~70fps
Окошко правда было маленькое.
А вообще и так медленновато. Хочется быстрее. Но не получается.
Номер ответа: 7
Автор ответа:
BUG(O)R
ICQ: 827887
Вопросов: 13
Ответов: 142
Web-сайт:
Профиль | | #7
Добавлено: 07.06.06 18:54
Глянь, я в своё время много полезного оттуда подчерпнул:
http://dotfix.net/module.php?module=@6e786b367c6763727275
Номер ответа: 8
Автор ответа:
Victor
ICQ: 345743490
Вопросов: 42
Ответов: 385
Web-сайт:
Профиль | | #8
Добавлено: 07.06.06 19:14
Посмотрел. Куча советов по ускорению программ VB.
По большому счету все, что там написано, я знаю (за редкими исключениями).
Ну что... на Си переходить или на асм чтоли? Правда ни того, ни другого я не знаю. И главный вопрос в том, сильное ли ускорение получится... Если в два раза, - это было бы очень неплохо.
Номер ответа: 9
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #9
Добавлено: 07.06.06 19:34
Графические алгоритмы в Си работают до 20 раз быстрее, чем в VB, так что смысл есть.
Номер ответа: 10
Автор ответа:
Victor
ICQ: 345743490
Вопросов: 42
Ответов: 385
Web-сайт:
Профиль | | #10
Добавлено: 14.06.06 13:00
Дома измерил. И убедился, что метод CopyMemory опять же примерно в 3 раза быстрее. И заодно еще раз убедился, что у меня на компе метод VB смотрится намного глаже.
По сему, иду в поиск реанимировать тему vsync.