2009-07-11 6 views
1

Ceci est peut-être une question oblique:VB6 Vertical Sync for Emulator

Je suis en train d'écrire un émulateur en VB6 (idiot). Pour rafraîchir la fenêtre en douceur dans l'émulateur lui-même, je voudrais saisir la synchronisation verticale du moniteur. Y a-t-il des appels d'API Windows que je peux utiliser? Ou est-ce une demande impossible?

Répondre

1

Ceci est mieux réalisé en utilisant l'API DirectX WaitForVerticalBlank, une partie de DirectDraw ONWARD v7, je crois. Beaucoup plus simple que l'enracinement dans RasterStatus.

0

Il existe WPF installations function on XP mais fonctionnent uniquement properly on Vista. Vous pouvez bring in open GL mais cela peut ne pas être pris en charge par toutes les cartes vidéo.

La seule solution efficace consiste à utiliser Direct3D, mais vous n'avez pas besoin de l'utiliser pour votre rendu. Juste greffer ses capacités. On dirait que IDirect3DDevice9::GetRasterStatus() est juste la chose. Votre solution de premier ordre peut l'interroger jusqu'à ce qu'elle signale InVBlank TRUE. Ensuite, vous pouvez faire une solution de second ordre où vous l'interrogez à travers une trame pour déterminer le taux de vsync et le timing relatif. Ensuite, utilisez une minuterie pour rester synchronisé. Peut-être se réveiller à chaque demi-trame et vérifier que vous frappez sur la même ligne de balayage en dehors de vsync. De cette façon, vous pouvez ajuster le timing pour rester synchronisé. J'ai mon propre émulateur de pet qui pourrait utiliser cette fonctionnalité. Si je code une solution, je posterai plus de détails ici.

0

Vous demandez la "synchronisation verticale du moniteur". La synchronisation verticale est un paramètre de carte graphique qui verrouille le taux de rendu de trame sur le taux de rafraîchissement du moniteur. Selon NVida, "Cela améliore la qualité de l'image en éliminant les effets de déchirement horizontaux dans l'image 3D." Voulez-vous savoir si la synchronisation verticale est activée ou désactivée ou recherchez-vous le taux de rafraîchissement du moniteur? Je ne sais pas comment faire l'ancien, mais vous pouvez obtenir ce dernier de cette façon:

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

Si vous voulez vraiment faire cela dans VB6, vous allez devoir regarder DirectX. Here est un bon point de départ pour la façon de faire DirectX en Vb6. Planet Source Code et CDVG ont encore quelques tutoriels.