这可能是一个倾斜的问题: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还有一些教程。