VB6 Vertical Sync für Emulator
-
12-09-2019 - |
Frage
Dies ist vielleicht eine schräge Frage:
Ich schreibe einen Emulator in VB6 (dumm von mir). Für einen reibungslosen Fenster im Emulator erfrischend selbst, würde Ich mag die vertikale Synchronisierung des Monitors greifen. Gibt es Windows-API-Anrufe kann ich verwenden? Oder ist dies eine unmögliche Anforderung?
Lösung
Dies wird am besten erreicht, die DirectX-API WaitForVerticalBlank verwenden, Teil von DirectDraw von v7 weiter, glaube ich. Viel einfacher als Verwurzelung um in RasterStatus.
Andere Tipps
Es gibt WPF Einrichtungen, die a href <= "https://stackoverflow.com / Fragen / 531.878 / wpf-Video-Zerreißen-on-windows-xp "> Funktion auf XP aber nur funktionieren, richtig auf Vista . Sie können in offener GL bringen, aber das nicht von allen unterstützt werden kann Grafikkarten.
Die einzig wirksame Lösung ist Direct3D zu verwenden, aber Sie müssen es nicht für Ihren Rendering verwenden. Huckepack nur seine Fähigkeiten. Sieht aus wie IDirect3DDevice9 :: GetRasterStatus () ist genau das Richtige. Ihre Lösung erster Ordnung kann abfragen, dass bis es meldet InVBlank TRUE. Dann können Sie eine Lösung zweiter Ordnung tun, wo man es durch einen Frame abfragen Vsync Rate und relative Timing zu bestimmen. Dann mit einem Timer synchron zu halten. Vielleicht wache jeden Halbrahmen und überprüfen, ob Sie über die gleiche Scan-Linie treffen sind, wenn sie aus Vsync. Auf diese Weise können Sie das Timing anpassen synchron zu halten.
Ich habe meinen eigenen Haustier-Emulator bekomme, die diese Funktionalität nutzen könnte. Wenn ich eine Lösung Code up Ich werde mehr Details hier posten.
Sie fordern die „vertikale Synchronisierung des Monitors“. Vertikale Synchronisierung ist eine Grafikkarte Einstellung, die die Frame Rendering Rate auf dem Monitor Bildwiederholfrequenz sperrt. Nach nvida „Dies verbessert die Bildqualität durch Effekte horizontal Reißen in dem 3D-Bild zu beseitigen.“ Wollen Sie wissen, ob vertikale Synchronisierung ein- oder ausgeschaltet ist oder waren Sie für die Bildwiederholfrequenz des Monitors suchen? Ich weiß nicht, wie die ersteren zu tun, aber man kann die letztere auf diese Weise erhalten:
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
Wenn Sie wirklich wollen, dass diese in VB6 zu tun, Sie gehen zu müssen, um DirectX zu suchen. Hier ist ein guter Ausgang Grund dafür, wie DirectX in VB6 zu tun. Planet Source Code und CDVG einige weitere Tutorials.