- Код: Выделить всё
Do Until rendering = False
'Здесь выполняется нужный код
FPS = FPS + 1
DoEvents
Loop
End
Так вот мне нужно сделать ограничение кадров за секунду. К примеру =50. Как это правильно в коде оформить?
Do Until rendering = False
'Здесь выполняется нужный код
FPS = FPS + 1
DoEvents
Loop
End
Don Leno писал(а):мне нужно сделать ограничение кадров за секунду. К примеру =50. Как это правильно в коде оформить?
Do Until rendering = False
Do While rendering
' //
' // VSync
' // Vista and later
' // By The trick
' //
Option Explicit
Private Type LUID
LowPart As Long
HighPart As Long
End Type
Private Type D3DKMT_OPENADAPTERFROMHDC
hDC As Long
hAdapter As Long
AdapterLuid As LUID
VidPnSourceId As Long
End Type
Private Type D3DKMT_WAITFORVERTICALBLANKEVENT
hAdapter As Long
hDevice As Long
VidPnSourceId As Long
End Type
Private Type D3DKMT_CLOSEADAPTER
hAdapter As Long
End Type
Private Declare Function D3DKMTOpenAdapterFromHdc Lib "gdi32" ( _
ByRef tAdapter As D3DKMT_OPENADAPTERFROMHDC) As Long
Private Declare Function D3DKMTWaitForVerticalBlankEvent Lib "gdi32" ( _
ByRef tEvt As D3DKMT_WAITFORVERTICALBLANKEVENT) As Long
Private Declare Function D3DKMTCloseAdapter Lib "gdi32" ( _
ByRef tAdapter As D3DKMT_CLOSEADAPTER) As Long
Private m_bIsRunning As Boolean
Private m_lFPSCounter As Long
Private Sub cmdStop_Click()
m_bIsRunning = False
End Sub
Private Sub Form_Load()
Dim tAdapterOpen As D3DKMT_OPENADAPTERFROMHDC
Dim tWaitVSync As D3DKMT_WAITFORVERTICALBLANKEVENT
Dim tAdapterClose As D3DKMT_CLOSEADAPTER
Dim lCounter As Long
Me.Show
' // Open adapter from HDC
tAdapterOpen.hDC = Me.hDC
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 = m_lFPSCounter + 1
' // To update timer
DoEvents
Loop
' // Close adapter
tAdapterClose.hAdapter = tAdapterOpen.hAdapter
D3DKMTCloseAdapter tAdapterClose
End Sub
' // Timer interval = 1000 ms
Private Sub tmrFPS_Timer()
Me.Caption = "FPS: " & m_lFPSCounter
m_lFPSCounter = 0
End Sub
Don Leno писал(а):Так вот мне нужно сделать ограничение кадров за секунду. К примеру =50. Как это правильно в коде оформить?
Don Leno писал(а):К примеру, чтобы игра на всех компьютерах разной мощности работала с одинаковой частотой.
Don Leno писал(а):И чтобы такого не происходило, хотелось бы добавить опционально такую плюху))
Don Leno писал(а):Как вычислить Дельту?
Do 'Игровой цикл
DoEvents
tOld=t
t=GetTime
Delta=t-tOld
'Здесь считаем физику
Loop
Don Leno писал(а):Thanx, Mikle, Хакер.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 50