2009-07-11 9 views
1

Das ist vielleicht eine schräge Frage:VB6 Vertikale Sync für Emulator

Ich schreibe einen Emulator in VB6 (dumme mich). Für eine reibungslose Aktualisierung des Fensters im Emulator würde ich gerne die vertikale Synchronisation des Monitors nutzen. Gibt es Windows-API-Aufrufe, die ich verwenden kann? Oder ist das eine unmögliche Anfrage?

Antwort

1

Die am besten erreicht wird, um die DirectX-API WaitForVerticalBlank verwenden, Teil von DirectDraw von v7 weiter, glaube ich. Viel einfacher als in RasterStatus herumzuwühlen.

0

Es gibt WPF Einrichtungen, die function on XP aber nur arbeiten properly on Vista. Sie können , aber das wird möglicherweise nicht von allen Grafikkarten unterstützt.

Die einzige effektive Lösung ist Direct3D zu verwenden, aber Sie müssen es nicht für Ihr Rendering verwenden. Huckepack einfach seine Fähigkeiten. Sieht aus wie IDirect3DDevice9::GetRasterStatus() ist genau das Richtige. Ihre Erstbestellungslösung kann diese abfragen, bis sie InVBlank TRUE meldet. Dann können Sie eine Lösung zweiter Ordnung durchführen, bei der Sie sie über einen Frame abfragen, um die vsync-Rate und das relative Timing zu bestimmen. Verwenden Sie dann einen Timer, um synchron zu bleiben. Vielleicht wachen Sie jeden halben Frame auf und stellen sicher, dass Sie ungefähr die gleiche Scanlinie treffen, wenn Sie kein Vsync mehr haben. Auf diese Weise können Sie das Timing anpassen, um synchron zu bleiben.

Ich habe meinen eigenen Haustieremulator, der diese Funktionalität verwenden könnte. Wenn ich eine Lösung einstelle, werde ich hier mehr Details veröffentlichen.

0

Sie fragen nach der "vertikalen Synchronisation des Monitors". Bei der vertikalen Synchronisierung handelt es sich um eine Grafikkarteneinstellung, mit der die Bildwiedergaberate an die Aktualisierungsrate des Monitors gebunden wird. Laut NVida "verbessert dies die Bildqualität, indem horizontale Reißerffekte im 3D-Bild eliminiert werden." Möchten Sie wissen, ob die vertikale Synchronisierung aktiviert ist oder ob Sie nach der Aktualisierungsrate des Monitors suchen? Ich weiß nicht, wie die ersteren zu tun, aber Sie können diese 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 
0

Wenn Sie dies wirklich in VB6 tun wollen, müssen Sie sich DirectX anschauen. ist ein guter Ausgangspunkt für DirectX in Vb6. Planet Source Code und CDVG haben einige weitere Tutorials.