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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top