代码之家  ›  专栏  ›  技术社区  ›  Guillermo Phillips

用于仿真器的VB6垂直同步

  •  1
  • Guillermo Phillips  · 技术社区  · 15 年前

    这可能是一个间接的问题:

    4 回复  |  直到 15 年前
        1
  •  1
  •   Jim Mack    15 年前

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

        2
  •  0
  •   Community PPrice    7 年前

    WPF 设施 function on XP 但只有工作 properly on Vista . 你可以 bring in open GL 但并非所有视频卡都支持这一点。

    IDirect3DDevice9::GetRasterStatus() 就是这样。您的一阶解决方案可以对此进行轮询,直到报告为TRUE。然后,您可以执行二阶解决方案,通过一帧轮询它以确定vsync速率和相对定时。然后使用计时器保持同步。也许每半帧醒来一次,确认退出vsync时,您所点击的扫描线大致相同。这样你就可以调整时间来保持同步。

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

        3
  •  0
  •   raven    15 年前

    您要求的是“显示器的垂直同步”。垂直同步是一种图形卡设置,用于将帧渲染速率锁定为监视器刷新速率。根据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
    
        4
  •  0
  •   Kris Erickson    15 年前

    如果您真的想在VB6中实现这一点,您必须查看DirectX。 Here 是在Vb6中执行DirectX的良好起点。 Planet Source Code CDVG 有更多的教程。

    推荐文章