2009-07-11 5 views
1

これは斜めの質問かもしれません。VB6(愚かな私)でエミュレータを書いています。エミュレータ自体のスムーズなウィンドウのリフレッシュのために、私はモニターの垂直同期を取りたいと思います。私が使用できるWindows API呼び出しはありますか?それともこれは不可能な要求ですか?エミュレータのVB6垂直同期

答えて

1

、私は信じています。 RasterStatusを迂回するよりもずっと簡単です。

0

がありますが、作業はproperly on Vistaです。WPFです。 bring in open GLでも可能ですが、すべてのビデオカードでサポートされているわけではありません。

唯一の効果的な解決策は、Direct3Dを使用することですが、レンダリングに使用する必要はありません。単にその能力を抱きしめるだけです。 IDirect3DDevice9::GetRasterStatus()のように見えるだけのことです。 InVBlank TRUEを報告するまで、最初の注文ソリューションはそれをポーリングできます。次に、1つのフレームでポーリングしてvsyncレートと相対的なタイミングを決定する2次ソリューションを実行できます。その後、タイマーを使用して同期を維持します。おそらく、ハーフフレームごとに目を覚まし、vsyncが外れたときに同じスキャンラインを叩いていることを確認してください。そうすれば、タイミングを調整して同期をとることができます。

私はこの機能を使用できる自分のペットエミュレータを持っています。ソリューションをコーディングすると、ここで詳細を掲載します。

0

"モニターの垂直同期"を求めています。垂直同期は、フレームのレンダリングレートをモニタのリフレッシュレートに固定するグラフィックスカードの設定です。 NVida氏によると、「これは、3D画像の水平方向の引き裂き効果を排除することによって画質を向上させます。垂直同期がオンかオフか、またはモニタのリフレッシュレートを探していますか?私は元を行う方法がわからない、しかし、あなたは後者をこのように得ることができます。これは最高のDirectX API WaitForVerticalBlank、以降V7からのDirectDrawの一部を使用して達成される

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

VB6でこれを実際に行いたい場合は、DirectXを参照する必要があります。 Hereは、Vb6でDirectXを実行する方法の良い出発点です。 Planet Source CodeCDVGにはもう少しチュートリアルがあります。