SR2D: Разные вопросы

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

С.Т.
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 10.03.2010 (Ср) 19:49

Re: SR2D: Разные вопросы

Сообщение С.Т. » 12.08.2025 (Вт) 17:28

В прошлый раз ответ не отправился:
Вот!!! Я ж чувствовал, что должно же что-то быть такое! Спасибо, дружище! Это идеально то, что надо. Работает в полтора раза быстрее заливки линиями. Более того – благодаря регулировке цветов на ходу в DrawDP3 можно обойтись без предварительного MulAddS2X, и тогда DrawDP3 быстрее линий ровно вдвое. Для интересующихся приложу обновлённый пример, где все три варианта инверсии на выбор пользователя, и есть флажок загрузки каждой инверсии циклом 400 раз для проверки скорости того или иного алгоритма:
У вас нет доступа для просмотра вложений в этом сообщении.

С.Т.
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 10.03.2010 (Ср) 19:49

Re: SR2D: Разные вопросы

Сообщение С.Т. » 12.08.2025 (Вт) 17:35

А ещё - самому удалось разработать мгновенное увеличение спрайта без интерполяции, простым копированием байтов в массиве и повтором строк:
Код: Выделить всё
Private Declare Function GetMem4 Lib "msvbvm60" (ByVal pSrc As Any, ByVal pDst As Any) As Long

Public Sub IncreaseTo(Dst As SR2D_Sprite, NewWidth As Long, NewHeight As Long)
        Dim pBuf As Long, pNewBuf As Long
        Dim x As Long, y As Long, yy As Long, newWidth4 As Long
        Dim difWidth As Single, difWidth4 As Long, difHeight As Single
        Dim MyY As Long, NewY As Long, Myyy As Long

    Dst.Init NewWidth, NewHeight

    'Предварительные вычисления (чтоб не каждый раз):
       pBuf = VarPtr(cBuf(0)) 'указатели запоминать только после Init!
       pNewBuf = Dst.DataPTR(0, 0)   
       newWidth4 = NewWidth * 4
       difWidth = meWidth / NewWidth:  difWidth4 = difWidth * 4
       difHeight = (NewHeight / meHeight) * NewWidth
   
    'Для каждой строки:
    For y = 0 To (meHeight - 3) * NewWidth Step NewWidth
        'Для каждого 4-байтного пикселя этой строки:
        For x = 0 To NewWidth - 1   
            GetMem4 pBuf + CLng(Fix((x + y) * difWidth) * 4), _
                    pNewBuf + (x + MyY) * 4
        Next x
       
        'Заполняем строки копиями:
        Myyy = MyY
        MyY = MyY + NewWidth
        NewY = NewY + difHeight
        Do While MyY < NewY
            CopyMemory Src:=ByVal pNewBuf + Myyy * 4, _
                      Dest:=ByVal pNewBuf + MyY * 4, Length:=newWidth4
            MyY = MyY + NewWidth
        Loop
    Next y
End Sub


(Логичней выглядит LoadIncrease с параметром Src, но мне надо было именно так для выгрузки в массив по указателю в дальнейшей редакции).

Итог.
Увеличение картинки примерно вчетверо (с камеры 640х480 на весь экран, вдвое по каждой оси) штатно с интерполяцией длится 80 - 90 мс и даёт ощутимые задержки в обновлении кадров при резких движениях; вручную же - 20 - 30 мс и не даёт видимых задержек даже в однопоточном режиме, при этом качество картинки на первый взгляд ничуть не хуже (если специально не всматриваться).

Приложил тестовый проект, где можно на ходу включить или отключить интерполяцию и сравнить качество и скорость в мс (делая резкие движения и сравнивая отклик с оригинальной картинкой):
У вас нет доступа для просмотра вложений в этом сообщении.

Пред.

Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList