PBPROG, похоже, что в PB массивах поменяны местами строки и столбцы, задай так:
Code
Map.l(767, 1023)
И во всех обращениях к массиву поменяй местами x и y. trew, хорошо бы тоже сделать визуализацию, чтобы убедиться, что код правильно работает.
Quote
Ну вот , а то часто видел реплики в сети, что VB6 тормоз. Вот прямое доказательство обратного!
Факт. Сколько видел таких тестов, доказывающих тормознутость VB6, везде либо полная безсмыслица, либо навязывание чуждого для VB6 стиля программирования.
Сообщение отредактировал -Mikle- - Пятница, 13 Апреля 2012, 13:38
Да, я ставлю такие же оптимизации. Проверил на Athlon64 3800+, VB6 довольно сильно вырвался вперёд: vb6 - 0.0505 pb -0.0594 На интеле примерно такие результаты, как у тебя. Табличку сделаю, только мне нужен EXE с QPC на PB.
Сообщение отредактировал -Mikle- - Пятница, 13 Апреля 2012, 12:02
Ты в VB6 из среды запускал? Запускай EXE, желательно мой (или сам включи все оптимизации). И от PB и FB хотелось бы EXE-шники, потестить на разных компах. И GetTickCount очень неточен, чем не устроил QPC? Ну и синтаксис у PB , впервые вижу. Я так понял "\", этот аналог сишного "->"? Но почему тогда
Code
vP\x = *vPos\x + *vDir\x
а не
Code
*vP\x = *vPos\x + *vDir\x
?
Сообщение отредактировал -Mikle- - Пятница, 13 Апреля 2012, 09:13
Сделал тест отдельной темой. Получилось, конечно, побольше 20-ти строк, но не так уж и много, тем более, что там простые действия, после копипаста и править почти ничего не понадобится.
Какой код в играх "съедает" основное время процессора? Рендер? Нет, рендерит видеокарта. Это физика либо логика ИИ. При этом большей частью производятся простые действия (сложение, умножение, деление, сравнение) над игровыми данными. А сами данные - это, как правило Single и Long, в "чистом" виде, в виде структур и массивов. При большом количестве игровых объектов, с ними работают через Quad или OcTree, это позволяет быстро отсеивать те объекты, которые обрабатывать не нужно (например, они находятся заведомо далеко). Обход Quad и Oc деревьев осуществляют, как правило, с помощью рекурсии. Исходя из этого для измерения производительности для игр хорошо подходит тест - рисование простого фрактала, это те же самые действия, тоже рекурсия, такие же данные. Вот проект на Visual Basic 6: FrVB6 Его можно перевести полностью, а можно только это:
Code
Private Sub DrawFractal(vPos As Vector, vDir As Vector) Dim vP As Vector, vD As Vector
If vDir.x * vDir.x + vDir.y * vDir.y < 0.017 Then Exit Sub vP.x = vPos.x + vDir.x vP.y = vPos.y + vDir.y DrawLine vPos, vP
Private Sub DrawLine(vP1 As Vector, vP2 As Vector) Dim x As Single, y As Single, k As Single, dx As Single, dy As Single
dx = vP2.x - vP1.x dy = vP2.y - vP1.y If Abs(dx) < Abs(dy) Then k = dx / dy If vP2.y > vP1.y Then y = vP1.y x = vP1.x While y < vP2.y Map(x, y) = &H50BB50 x = x + k y = y + 1 Wend Else y = vP2.y x = vP1.x While y < vP1.y Map(x, y) = &H40FF30 x = x + k y = y + 1 Wend End If Else k = dy / dx If vP2.x > vP1.x Then x = vP1.x y = vP1.y While x < vP2.x Map(x, y) = &HA0AF20 y = y + k x = x + 1 Wend Else x = vP2.x y = vP1.y While x < vP1.x Map(x, y) = &H609F30 y = y + k x = x + 1 Wend End If End If End Sub
определяем (если нет) структуру:
Code
Private Type Vector x As Single y As Single End Type
Создаём массив и два вектора:
Code
Dim Map(1023, 767) As Long Dim vP As Vector, vD As Vector
PBPROG, там GoSub... ужас. На VB6 это не оптимизируется. Тест действительно древний и не очень корректен. Я не хочу никого заставлять применять нетипичные для языка приёмы. trew,
К слову, о быстродействии. Опять вижу рекомендацию узкие места прописывать на "вставьте своё", когда-то мне советовали при программировании на VB6 узкие места выделять в DLL на PowerBasic (тот самый jungle советовал). Наконец, я провёл тест - и выяснил, что VB6 быстрее. Я не хочу спорить о преимуществах ООП или указателей, как программировать - это дело вкуса. Я не спорю, что VB6 - только под Винду. Я не вижу практического смысла в программе, выводящей собственный листинг. Я хочу только выяснить, есть ли бейсик быстрее. Есть желающие присоединиться? Могу предложить простой тест, типично игровые вычисления, никакой привязки к ООП, ещё каким-нибудь особенностям.
Это середина переднего и заднего бамперов, величины вспомогательные, если рендерить спрайт, то достаточно центральной точки и угла поворота Alpha (в радианах). Это:
Code
x = (x - Int(x)) * Me.ScaleWidth y = (1 - y + Int(y)) * Me.ScaleHeight
Сделано, чтобы машина, выезжая за край, появлялась с другой стороны.
Quote (clidi)
Вместо this->getAngle() вставить alpha или как?
Скорее вместо этого: ((90+this->getAngle())*(PI/180.0f))
Сообщение отредактировал -Mikle- - Пятница, 09 Марта 2012, 16:05
как исправить так, чтоб скорость постоянно была положительной?
Скорость - это вектор, он не может быть положительным или отрицательным. Если имеется ввиду та_циферка_что_на_спидометре, то это модуль проекции скорости на вектор, направленный вдоль корпуса машины. В моём 2D примере это модуль величины SpY после перевода величин в локальную систему координат автомобиля.
clidi, вот простой пример автофизики на Visual Basic 6 с исходником: ss2d Управление: a, z - сменить передачу стрелка вверх - газ стрелка вниз - тормоз Вот, если надо, в 3D: ss3d но этот не запустится в Win Vista и новее, или нужно добавить и зарегистрировать dx8vb.dll.
Сообщение отредактировал -Mikle- - Вторник, 06 Марта 2012, 14:54
Давно занимаюсь разработкой софтверного движка 2D графики для VB6.
SR2D предназначен для использования при создании оконных 2D приложений. На настоящий момент SR2D состоит из модуля modSR2D, класса SR2D_Sprite и DLL - SR2D.dll. Класс SR2D_Sprite предназначен для хранения двумерного изображения с альфа каналом, различных его преобразований и отображения на форму или любой контрол, обладающий hDC. Для использования необходимо подключить к проекту указанные модуль и класс, а DLL разместить в папке проекта. Движок не использует для работы никаких API, кроме SetDiBitsToDevice, используемой для вывода изображения на экран и нескольких ф-ций GDI+ для чтения и сохранения файлов. SR2D.dll на 10% написана на C++ и на 90% на ассемблере с активным применением MMX. Это - набор API-подобных stdcall ф-ций.
Движок свободен для некоммерческого и коммерческого использования. Единственное условие - не переименовывать SR2D.dll. То, что движок "для VB6" - не критично, модуль modSR2D и класс SR2D_Sprite фактически являются портом SR2D.dll для VB6, для использования SR2D с любым языком достаточно перевести порт.
Я только что зарелизил версию 3.1 SR2D, тут несколько небольших примеров: SR2D_3_1 287 кБ.
Пока полноценного ReadMe нет, но можно смотреть старый ReadMe, от версии 2.0, изменения вполне логичны и понятны без доп. описания, тут движок, ReadMe и несколько примеров для версии 2.0: SR2D_2_0 400 кБ.
Что нового по сравнению с версией 2.0: 1. Добавился оператор OpBlend (интерполяция источника и приёмника). 2. Теперь использовать маску можно не только с любым оператором, но и с MulAddS2X, ClearBuffer, MoveBit, MoveByte, DrawDPBM, DrawEBM. 3. В DrawDPBM добавился точечный источник света. 4. Загрузка из файла средствами GDI+, соответственно поддержка .bmp, .jpg, .png и т. д. форматов. 5. Сохранение в .bmp, .jpg, .png с альфаканалом (кроме .jpg) и без него. 6. При загрузке можно задавать трансформации - масштабирование (с фильтрацией), поворот, отражение. 7. Появился поворот спрайта на произвольный угол, в том числе с АА. 8. ColorKey теперь задаётся не только при загрузке, но и через метод AddColorKey. "Add" потому, что таких ключей можно задавать сколько угодно, все указанные цвета станут прозрачными. 9. Новый метод MaskInterSector позволяет находить площадь пересечения масок. Удобно применять для коллизий, задавая в качестве маски альфаканал.
Примеры готовых игр, на старой версии: BriX 58 кБ.
Добавлено (04.11.2011, 14:09) --------------------------------------------- Сделал пример рисования кистью и некоторых других технологий, применимых в графических редакторах: Paint и пример анимации: Anim
Добавлено (24.11.2011, 10:16) --------------------------------------------- Скринсейвер, фигуры Лиссажу в 3D: Stars Выключение по движению мышки я убрал специально. Управление: Space - смена рисунка. Escape - выход.
Добавлено (25.01.2012, 14:47) --------------------------------------------- Портировал третью версию SR2D на C# и vb.net. Пример пока один - DPBM: SR2D_CS SR2D_NET
Сообщение отредактировал -Mikle- - Суббота, 04 Февраля 2012, 17:50
А когда будут подводится результаты конкурса? Ведь конкурс объявлен, а потом все заброшено!
Мне как-то неудобно себя победителем объявлять :), да и конкурс из тех, которые можно не заканчивать. У тебя, кстати, второе место, даже если учитывать многочисленные работы на GameDev.ru. Моя DLL, кстати, тоже на бейсике, только это VB6.
PBPROG, залей на нормальный хостинг, например: http://www.188.ru/ http://narod.yandex.ru/ А то ждёшь минуту, смотришь рекламу, закрываешь попап окна - а потом видишь капчу, которую не можешь прочесть. На GameDev, вроде как, побили порог 50к.
Предлагаю приз - тому, кто до 23-59-59 6.01.2012 покажет РАБОТОСПОСОБНУЮ dll с лучшим результатом, каждый участник этого обсуждения плюсует в репу. dll со стороны не в счёт.