Войти
Вело-изобретателиФорумSR2D - софтовый 2D движок

SR2D, тестируем x64 версию. (8 стр)

Страницы: 17 8 9 1014 Следующая »
#105
20:50, 3 окт 2021

the trick
спасибо посмотрю может разберусь

#106
(Правка: 23:12) 23:06, 18 фев 2022

Привет. Незадолго после того как отписался, что разберусь, заболел ковидом. Что-то после этого вообще желание отпало чем либо заниматься.

Сейчас, спустя пол года, решил всё-таки разобраться с VSync-ом., по примеры из предыдущего поста.

Я правильно понимаю что, все действия и отрисовку нужно помещать в блок Do While m_bIsRunning?
Я портировал (слишком жирное слово, конечно для данного кода) это дело на vb.net
по началу не работало вообще, я так понимаю, либо задумывается откуда-то m_bIsRunning сделать тру чтобы запустить, либо в вб 6 объявленные булеаны тру по дефолту, я не уверен
я просто присобачил ему тру при объявлении, заработал ду вайл

я поместил туда простенький код с движением кубика
вроде бы работает и теаринга нет, хотя в самом начале фпс рывками, а потом стабилизируется

еще немного не понятно, tAdapterOpen.hDC = Me.CreateGraphics.GetHdc
в примере hdc берется из формы именно, это так и должно остаться, даже если я picturebox рисую через Painttodevice?

    Private Sub tmrFPS_Timer()
        Me.Text = "FPS: " & m_lFPSCounter
        m_lFPSCounter = 0
    End Sub

и вот этот блок я вообще не понял
выглядит, как процедура, но в примере она нигде не вызывается вроде
или это старый вб 6стный таймер? по крайней мере я попробовал сунуть это дело в таймер, но фпс какой-то странный выдается, я не думаю что это фпс, или я в таймере что-то не так выставил по интервалу, или я вообще нифига правильно не понял как это должно работать, что скорее всего.

#107
18:40, 19 фев 2022

SilentPrayerCG
> я так понимаю, либо задумывается откуда-то m_bIsRunning сделать тру чтобы
> запустить, либо в вб 6 объявленные булеаны тру по дефолту
Нет, по дефолту False, но там же есть строка:

m_bIsRunning = True

SilentPrayerCG
> Я правильно понимаю что, все действия и отрисовку нужно помещать в блок Do
> While m_bIsRunning?
Правильно, точнее, туда, где инкрементируется счётчик, то есть после проверки на ошибку.
SilentPrayerCG
> еще немного не понятно, tAdapterOpen.hDC = Me.CreateGraphics.GetHdc
> в примере hdc берется из формы именно, это так и должно остаться, даже если я
> picturebox рисую через Painttodevice?
hDC бери от того контрола, на который рисуешь, только не как в VB6, а как положено в NET:

hDC = New HandleRef(Grp, Grp.GetHdc)

tmrFPS_Timer() - это обработчик таймера с интервалом 1000 мс, это просто для подсчёта FPS используется, для vsync не важно.

#108
(Правка: 22:40) 22:28, 19 фев 2022

Mikle
Да, я что-то пропустил этот блок где тру и еще две строчки.
Частями копировал и переводил и пропустил.

Вот по поводу tAdapterOpen.hDC,  который в примере равен hDC формы.
Он лонг, а hDC это HandleRef.
Я что-то совсем не врубаюсь вот в этот момент.

В начале класса формы объявляем.
    Dim Grp As Graphics
    Dim Hdc As HandleRef
В PictureBox в HandleCreated
присваиваем grp - graphics бокса
А сам hDC берется из графикса

        Grp = sender.CreateGraphics
        Hdc = New HandleRef(Grp, Grp.GetHdc)

Gолучается в примере, где tAdapterOpen.hDC = нужно сделать
      tAdapterOpen.hDC = grp.gethdc
?

Нет, нефига.. говорит объект уже занят.

= hDC.handle может?
Z извиняюсь конечно за нубизм, потому что вот эти hDC наверное изучать где-то нужно, я не уверен, что это и как это работает. Ну т.е я по примерам кода, смутно понимаю что это такое. Вообще Handle это IntPtr, это я так понимаю указатель какой-то?

И насчет таймера.
Вот я сделал таймер (ну контрол) 1 сек делей, и вставил код из той процедуры таймера из примера, с выводом счетчика и обнулением.
Но фпс показывается в районе 4300

Значит, видимо, vsync не работает? Ну т.е я что-то сделал не правильно.

#109
23:01, 19 фев 2022

SilentPrayerCG
> Нет, нефига.. говорит объект уже занят.
Ты его уже один раз получил, не нужно делать второй раз, пользуйся первым.
У меня сейчас не установлен vb.net на x64 системе, так бы показал. Просто посмотри примеры SR2D, тот же DPBM, там везде есть получение hDC и его уничтожение в конце. Да, он имеет тип HandleRef, попробуй просто привести тип к Integer, когда будет нужно, не к Long, Long в VB6 - это то же, что Integer в vb.net.

#110
(Правка: 10:19) 10:15, 20 фев 2022

Mikle
Да точно, они же сдвинули разрядность в типах, то что раньше было лонг, теперь тупо интеджер
я заменил все что там с лонгом было в интеджер
но как правильно handleref привести к integer? hdc.handle?


теперь срабатывает "не возможно открыть адаптер"...
очевидно после того, как я заменил все лонги на интеджер.
вернул функциям Long (оставил интеджер только в структуре которая в вб 6 была тайп)
заработало, но все равно фпс конский таймер выдает

сделал так    tAdapterOpen.hDC = Hdc.Handle
но не уверен что это надо так, hdc это hdc picturebox-а
я явно что-то не правильно делаю, потому что с hdc формы так-же работало

#111
10:23, 20 фев 2022

SilentPrayerCG
> привести к integer? hdc.handle?
Проверил на Win32 - это работает.

#112
(Правка: 18:08) 13:59, 20 фев 2022

Mikle
ну если это все дело это именно v-sync разве счетчик фпс не должен выдавать в районе 60? потому что это частота монитора, он тысячи какие-то выдает, может я что-то не так сделал?

ps
у меня вот мозги вроде шевелится начинают
я смотрю сейчас на этот код и я что-то не понимаю, как он должен работать

если все действия и отрисовка лежат в цикле do while
то они же просто происходят в цикле, на каком этапе в этом цикле происходит синхронизация с монитором?

#113
18:31, 20 фев 2022

SilentPrayerCG
> если все действия и отрисовка лежат в цикле do while
> то они же просто происходят в цикле, на каком этапе в этом цикле происходит
> синхронизация с монитором?
Функция D3DKMTWaitForVerticalBlankEvent() ожидает конца кадра либо выдаёт значение <0, что есть ошибка.

#114
(Правка: 21 фев 2022, 21:21) 22:09, 20 фев 2022

Mikle
аа, вот теперь понял

а что по таймеру?
я же правильно понял что в-синк должен ограничивать фпс до частоты монитора?

у меня код сейчас такой
я особо не заморачивался, пока просто квадратик туда сюда теребонькается

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim tAdapterOpen As D3DKMT_OPENADAPTERFROMHDC
        Dim tWaitVSync As D3DKMT_WAITFORVERTICALBLANKEVENT
        Dim tAdapterClose As D3DKMT_CLOSEADAPTER
        Dim lCounter As Long

        Dim s As New Sprite(512, 512)
        Dim s2 As New Sprite(50, 50)
        Dim x, y, y2, y2s As Double

        y2s = 0.0001


        Show()
        ' // Open adapter from HDC
        tAdapterOpen.hDC = Hdc.Handle

        If D3DKMTOpenAdapterFromHdc(tAdapterOpen) < 0 Then
            MsgBox("Unable to open adapter", vbCritical)
            Exit Sub
        End If

        m_bIsRunning = True

        ' // Set wait event param
        tWaitVSync.hAdapter = tAdapterOpen.hAdapter
        tWaitVSync.VidPnSourceId = tAdapterOpen.VidPnSourceId

        Do While m_bIsRunning

            ' // Wait until vsync
            If D3DKMTWaitForVerticalBlankEvent(tWaitVSync) < 0 Then
                MsgBox("Unable to ait vsync", vbCritical)
                Exit Do
            End If

            m_lFPSCounter += 1

            s.ClearBuffer(0)
            s2.ClearBuffer(ARGB(255, 30, 255, 30))
            s.Draw(s2, x, y)

            y = Lerp(0, 512, y2)

            y2 += y2s
            If y2 > 1 Then y2s = -0.0001
            If y2 < 0 Then y2s = 0.0001
            x += 0.1
            If x > 512 Then x = 0

            s.PaintToDevice(Hdc)

            ' // To update timer
            Application.DoEvents()
        Loop


        ' // Close adapter
        tAdapterClose.hAdapter = tAdapterOpen.hAdapter

        D3DKMTCloseAdapter(tAdapterClose)

        Me.Text = "ended"

    End Sub

    ' // Timer interval = 1000 ms
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Text = "FPS: " & m_lFPSCounter
        m_lFPSCounter = 0
    End Sub

    Private Sub PictureBox1_HandleCreated(sender As Object, e As EventArgs) Handles PictureBox1.HandleCreated
        Grp = sender.CreateGraphics
        Hdc = New HandleRef(Grp, Grp.GetHdc)
    End Sub

таймер в итоге выдает около 4500

ps
я может ошибаюсь, я уже не уверен, может вертикалка не обязательно лочит фпс на частоте монитора?
как-то может ограничивать отдельно надо?

Ps

мне кажется у меня всё-таки этот пример не работает, по какой-то причине
я убрал проверку функции D3DKMTWaitForVerticalBlankEvent
и собственно не вижу разницы
хотя и теаринга не вижу
хотя вообще я планировал не просто избавится а теаринга а еще сделать чтобы все было 60 фпс
думал что в-синк как раз обеспечит оба пункта

+ Показать
#115
(Правка: 20:47) 20:31, 22 фев 2022

Я погуглил про эту функцию D3DKMTWaitForVerticalBlankEvent
Я так понял отрисовку нужно выполнять если она возвращает STATUS_SUCCESS
Но я не пойму, какие числовые значения соответствуют каким NTSTATUS'ам, я нашел только таблицу кодов типа 0x000000000
И я проверил что у меня выдает эта функция, и она всегда 3221225485

ок, с иксом коды это хексы, чекнул, возвращает инвалид параметр
0xC000000D

STATUS_INVALID_PARAMETER

погуглил https://www.vbforums.com/showthread.php?314130-hDC-in-VB-Net
тут чел пишет что handle это не hdc а hwnd

#116
20:49, 22 фев 2022

SilentPrayerCG
Нужно понять, у тебя вообще не работает D3DKMTWaitForVerticalBlankEvent(), или только из x64 кода.
Проверь этот проект: https://disk.yandex.ru/d/bNaB-0ij0CBIcQ
Это тот самый код, скомпилированный в VB6. Что показывает?

#117
(Правка: 21:00) 20:57, 22 фев 2022

Ща гляну. Т.е эта функция на х64 может не работать? Странно.
чекнул
анейбл то старт адаптер говорит (но оно уже уже откомпилено, я что-то не припомню что-бы 32битные приложения как-то иначе под 64 битной виндой работали, разве что только в самом начале, когда только стала появляться поддержка 64, я думал винда идеально все эмулирует)

#118
21:01, 22 фев 2022

SilentPrayerCG
> анейбл то старт адаптер
Воот... а что за система?

#119
21:03, 22 фев 2022

Mikle
11 64 бита. могу еще на 10 64 бита проверить

Страницы: 17 8 9 1014 Следующая »
Вело-изобретателиФорумSR2D - софтовый 2D движок