2009-07-11 63 views
1

这可能是一个倾斜的问题:VB6垂直同步模拟器

我在VB6(愚蠢的我)写一个模拟器。为了让仿真器本身的窗口更加清爽,我想抓住显示器的垂直同步。有没有可以使用的Windows API调用?或者这是不可能的要求?

回答

1

这最好使用DirectX API WaitForVerticalBlank,从V7起的DirectDraw的一部分实现,我相信。比在RasterStatus中扎根更简单。

0

WPF设施,其中function on XP但只能工作properly on Vista。您可以bring in open GL但所有视频卡可能不支持。

唯一有效的解决方案是使用Direct3D,但不必将其用于渲染。只需搭载其功能即可。看起来像IDirect3DDevice9::GetRasterStatus()就是这样。您的第一个订单解决方案可以轮询,直到它报告InVBlank TRUE。然后,您可以执行第二个订单解决方案,在该解决方案中通过一帧来轮询它以确定vsync速率和相对时间。然后使用计时器保持同步。也许每半帧醒来一次,并验证您在vsync之外时是否碰到同一条扫描线。这样你可以调整时间保持同步。

我有我自己的宠物模拟器,可以使用此功能。如果我编码解决方案,我会在这里发布更多细节。

0

您正在询问“显示器的垂直同步”。垂直同步是一种图形卡设置,可将帧渲染速率锁定到显示器刷新速率。根据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 
0

如果你真的想在VB6中做到这一点,你将不得不看DirectX。 Here是如何在Vb6中执行DirectX的一个很好的起点。 Planet Source CodeCDVG还有一些教程。