Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: CopyMemory vs For..Next Добавлено: 07.06.06 12:52  

Автор вопроса:  Victor | Web-сайт: vt-dbnz.narod.ru | ICQ: 345743490 
Что быстрее:
Public Sub DrawBitmapOnArray(ByRef DIB As vtDIB, _
                             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-сайт: vt-dbnz.narod.ru
 Профиль | | #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-сайт: vt-dbnz.narod.ru
 Профиль | | #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-сайт: vt-dbnz.narod.ru
 Профиль | | #6
Добавлено: 07.06.06 17:00
Протестил на проце 200mhz.
VB: ~30fps
API: ~70fps
Окошко правда было маленькое.
А вообще и так медленновато. Хочется быстрее. Но не получается.

Ответить

Номер ответа: 7
Автор ответа:
 BUG(O)R



ICQ: 827887 

Вопросов: 13
Ответов: 142
 Web-сайт: hunger.ru
 Профиль | | #7
Добавлено: 07.06.06 18:54

Глянь, я в своё время много полезного оттуда подчерпнул:

http://dotfix.net/module.php?module=@6e786b367c6763727275

Ответить

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



ICQ: 345743490 

Вопросов: 42
Ответов: 385
 Web-сайт: vt-dbnz.narod.ru
 Профиль | | #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-сайт: vt-dbnz.narod.ru
 Профиль | | #10
Добавлено: 14.06.06 13:00
Дома измерил. И убедился, что метод CopyMemory опять же примерно в 3 раза быстрее. И заодно еще раз убедился, что у меня на компе метод VB смотрится намного глаже.

По сему, иду в поиск реанимировать тему vsync.

Ответить

Страница: 1 |

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



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