Sincronização Vertical VB6 para Emulator
-
12-09-2019 - |
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?
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
Há 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.