這可能是一個傾斜的問題:VB6垂直同步模擬器
我在VB6(愚蠢的我)寫一個模擬器。爲了讓仿真器本身的窗口更加清爽,我想抓住顯示器的垂直同步。有沒有可以使用的Windows API調用?或者這是不可能的要求?
這可能是一個傾斜的問題:VB6垂直同步模擬器
我在VB6(愚蠢的我)寫一個模擬器。爲了讓仿真器本身的窗口更加清爽,我想抓住顯示器的垂直同步。有沒有可以使用的Windows API調用?或者這是不可能的要求?
這最好使用DirectX API WaitForVerticalBlank,從V7起的DirectDraw的一部分實現,我相信。比在RasterStatus中紮根更簡單。
有WPF設施,其中function on XP但只能工作properly on Vista。您可以bring in open GL但所有視頻卡可能不支持。
唯一有效的解決方案是使用Direct3D,但不必將其用於渲染。只需搭載其功能即可。看起來像IDirect3DDevice9::GetRasterStatus()就是這樣。您的第一個訂單解決方案可以輪詢,直到它報告InVBlank TRUE。然後,您可以執行第二個訂單解決方案,在該解決方案中通過一幀來輪詢它以確定vsync速率和相對時間。然後使用計時器保持同步。也許每半幀醒來一次,並驗證您在vsync之外時是否碰到同一條掃描線。這樣你可以調整時間保持同步。
我有我自己的寵物模擬器,可以使用此功能。如果我編碼解決方案,我會在這裏發佈更多細節。
您正在詢問「顯示器的垂直同步」。垂直同步是一種圖形卡設置,可將幀渲染速率鎖定到顯示器刷新速率。根據NVida的說法,「這可以通過消除3D圖像中的橫向撕裂效應來提高圖像質量。」你想知道垂直同步是打開還是關閉,或者你是否在尋找顯示器的刷新率?我不知道該怎麼辦了前者,但你可以得到後者的這種方式:
Private Const CCHDEVICENAME = 32
Private Const CCHFORMNAME = 32
Private Type DEVMODE
dmDeviceName As String * CCHDEVICENAME
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
dmFormName As String * CCHFORMNAME
dmUnusedPadding As Integer
dmBitsPerPel As Long
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type
Private Declare Function EnumDisplaySettings Lib "user32.dll" Alias _
"EnumDisplaySettingsA" (ByVal lpszDeviceName As String, _
ByVal iModeNum As Long, ByRef lpDevMode As DEVMODE) As Long
Private Function GetRefreshRate() As Long
Dim dm As DEVMODE
dm.dmSize = Len(dm)
EnumDisplaySettings vbNullString, ENUM_CURRENT_SETTINGS, dm
GetRefreshRate = dm.dmDisplayFrequency
End Function
如果你真的想在VB6中做到這一點,你將不得不看DirectX。 Here是如何在Vb6中執行DirectX的一個很好的起點。 Planet Source Code和CDVG還有一些教程。