VB6垂直同步仿真器

时间:2009-07-11 16:49:06

标签: vb6 vsync vertical-sync

这可能是一个倾斜的问题:

我正在VB6中编写一个模拟器(愚蠢的我)。为了在模拟器本身中平滑地刷新窗口,我想获取监视器的垂直同步。我可以使用任何Windows API调用吗?或者这是一个不可能的要求?

4 个答案:

答案 0 :(得分:1)

我相信使用DirectX API WaitForVerticalBlank可以最好地实现这一点,这是从v7开始的DirectDraw的一部分。比在RasterStatus中生根要简单得多。

答案 1 :(得分:0)

WPF个设施function on XP但只有properly on Vista。您可以bring in open GL但所有视频卡可能都不支持。

唯一有效的解决方案是使用Direct3D,但您不必将它用于渲染。只是背负其能力。看起来像IDirect3DDevice9::GetRasterStatus()就是这样。您的第一个订单解决方案可以轮询,直到它报告InVBlank为真。然后你可以做一个二阶解决方案,你通过一帧轮询它来确定vsync率和相对时间。然后使用计时器保持同步。也许醒来每半帧并确认你在vsync之外击中相同的扫描线。这样你就可以调整时间以保持同步。

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

答案 2 :(得分: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

答案 3 :(得分:0)

如果你真的想在VB6中这样做,你将不得不看看DirectX。 Here是如何在Vb6中执行DirectX的良好开端。 Planet Source CodeCDVG还有一些教程。