1

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

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

4

4 回答 4

1

我相信,这最好使用 DirectX API WaitForVerticalBlank 来实现,它是从 v7 开始的 DirectDraw 的一部分。比在 RasterStatus 中查找要简单得多。

于 2009-07-11T20:27:15.547 回答
0

有一些WPF工具可以在 XP 上运行,但只能在 Vista 上正常运行。您可以引入 open GL,但可能并非所有视频卡都支持。

唯一有效的解决方案是使用 Direct3D,但您不必将其用于渲染。只是搭载它的能力。看起来IDirect3DDevice9::GetRasterStatus()就是这样。您的一阶解决方案可以轮询它,直到它报告 InVBlank TRUE。然后您可以执行二阶解决方案,通过一帧对其进行轮询以确定垂直同步速率和相对时间。然后使用计时器保持同步。可能每半帧醒来一次,并验证您在不同步时是否击中了大约相同的扫描线。这样您就可以调整时间以保持同步。

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

于 2009-07-11T17:50:20.653 回答
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
于 2009-07-11T18:49:13.357 回答
0

如果您真的想在 VB6 中执行此操作,您将不得不查看 DirectX。 是如何在 Vb6 中执行 DirectX 的良好起点。Planet Source CodeCDVG还有一些教程。

于 2009-07-12T22:50:41.520 回答