Вертикальная синхронизация VB6 для эмулятора - PullRequest
1 голос
/ 11 июля 2009

Возможно, это косой вопрос:

Я пишу эмулятор в VB6 (глупый я). Для плавного обновления окна в самом эмуляторе хотелось бы захватить вертикальную синхронизацию монитора. Могу ли я использовать какие-либо вызовы Windows API? Или это невозможный запрос?

Ответы [ 4 ]

1 голос
/ 12 июля 2009

Лучше всего это сделать с помощью DirectX API WaitForVerticalBlank, который, как мне кажется, является частью DirectDraw начиная с версии 7 Гораздо проще, чем копаться в RasterStatus.

0 голосов
/ 13 июля 2009

Если вы действительно хотите сделать это в VB6, вам придется взглянуть на DirectX. Здесь является хорошей отправной точкой для работы с DirectX в Vb6. Исходный код планеты и CDVG имеют еще несколько учебных пособий.

0 голосов
/ 11 июля 2009

Вы запрашиваете «вертикальную синхронизацию монитора». Вертикальная синхронизация - это настройка видеокарты, которая привязывает частоту рендеринга кадров к частоте обновления монитора. По словам 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 голосов
/ 11 июля 2009

Существуют WPF средства, которые работают на XP , но работают только должным образом на Vista . Вы можете принести открытый GL , но это может поддерживаться не всеми видеокартами.

Единственное эффективное решение - использовать Direct3D, но вам не нужно использовать его для рендеринга. Просто воспользуйтесь его возможностями. Похоже, IDirect3DDevice9 :: GetRasterStatus () это просто вещь. Ваше решение первого порядка может опрашивать это, пока не сообщит InVBlank TRUE. Затем вы можете сделать решение второго порядка, где вы опрашиваете его через один кадр, чтобы определить частоту синхронизации и относительную синхронизацию. Затем используйте таймер для синхронизации. Возможно, просыпаться каждые полукадра и проверять, что вы выходите за одну и ту же строку сканирования при выходе из vsync. Таким образом, вы можете настроить синхронизацию, чтобы поддерживать синхронизацию.

У меня есть собственный эмулятор питомца, который может использовать эту функцию. Если я напишу решение, я опубликую более подробную информацию здесь.

...