Pergunta

Esta é talvez uma questão oblíqua:

Eu estou escrevendo um emulador em VB6 (bobo me). Para a janela suave refrescante no próprio emulador, eu gostaria de pegar a sincronização vertical do monitor. Existem quaisquer chamadas API do Windows que eu possa usar? Ou este é um pedido impossível?

Foi útil?

Solução

Este é o melhor alcançado usando a API DirectX WaitForVerticalBlank, parte de DirectDraw de v7 em diante, eu acredito. Muito mais simples do enraizamento em torno de RasterStatus.

Outras dicas

WPF instalações que função no XP mas apenas trabalhos corretamente no Vista . Você pode trazer aberta GL mas isso pode não ser suportado por todos placas de vídeo.

A única solução eficaz é usar Direct3D, mas você não tem que usá-lo para o seu processamento. Apenas pegar carona suas capacidades. Looks como IDirect3DDevice9 :: GetRasterStatus () é apenas a coisa. Sua solução de primeira ordem pode pesquisar que até ele relata InVBlank TRUE. Então você pode fazer uma segunda solução ordem onde sondar-lo através de um quadro para determinar a taxa vsync e tempo relativo. Em seguida, use um temporizador para manter em sincronia. Talvez acordar a cada meia moldura e verificar se você está batendo na mesma linha de varredura quando fora de vsync. Dessa forma, você pode ajustar o tempo para manter em sincronia.

Eu tenho meu próprio emulador de estimação que poderia usar essa funcionalidade. Se eu código-se uma solução vou postar mais detalhes aqui.

Você está pedindo o "sync vertical do monitor". sincronização vertical é uma configuração da placa gráfica que bloqueia a taxa de prestação de quadros para a taxa de atualização do monitor. De acordo com NVIDA, "Isso melhora a qualidade de imagem, eliminando efeitos rasgando horizontais na imagem 3D." Você quer saber se a sincronização vertical é ligado ou desligado ou você estava procurando a taxa de atualização do monitor? Eu não sei como fazer o primeiro, mas você pode obter o último desta maneira:

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

Se você realmente quer fazer isso em VB6, você vai ter que olhar para DirectX. Aqui é uma boa iniciar chão para saber como fazer DirectX em VB6. Planeta Source Code e CDVG ter mais alguns tutoriais.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top