VsyncPatch

基本的な使用方法は、VsyncPatch rev6と同じです
使用方法の詳細は、rev6のreadmeを御覧下さい

■対応OS
確認済：Windows 7 64bit版
vista以上対応(xp以前は非対応)

■対応ゲーム
東方紺珠伝 ver1.00b

■警告
本非公式パッチは、ゲームの内部動作を大幅に変更します
本パッチを当てると不具合がでるかもしれません
実行前にscore.dat等をバックアップすることを推奨します
また、十分に動作確認をした上でご使用ください
特に本パッチを使用した状態でリプレイを保存、公開される方はご注意ください
本パッチ適用時のリプレイに関しては、東方Projectスコアボードに投稿することはできません
リプレイをwebやuploder等で公開する場合は、VsyncPatchを使用していることを明記すると、
トラブルになりにくいかと思います
本パッチは非公式に作成したものです
公式に問い合わせないようにお願いします

■再配布
ご自由に再配布してくださってかまいません
ただし、zip内のファイルを変更・追加せず
そのままの状態で再配布をお願いします

■インストール
vpatch.exe、vpatch_th??.dll、vpatch.iniのファイルを
東方シリーズをインストールしたフォルダにコピーしてください
iniファイルは無くても一応動作します

東方紺珠伝の場合はvpatch.exeとvpatch_th15.dllとvpatch.ini

※パッチの動作不良で、score.dat等がおかしくなる可能性もあるかもしれません
※念のためバックアップをとってからパッチを実行するようにしてください
※vpatch.exeは、vpatchという名のつくdllを同じフォルダ内で検索し、
※最初に見つかったdllをロードします
※したがって、同じフォルダ内に別のvpatch dllがあると、うまく起動できません
※東方シリーズをインストールしたフォルダには、
※対応しているdllのみを入れるようにしてください

■アンインストール
インストール時にコピーしたexeとdll及びiniファイルを削除してください


■iniファイル
[Option]
Vsync (デフォルト=0)

　0を指定すると垂直同期をせずに、描画を行います
　高fpsで安定させることができる代わりに、ティアリング(ちらつき)が発生する可能性があります

　1を指定すると独自の方法で垂直同期をとり、描画を行います
　Gameの速度(fps)は、モニタのリフレッシュレートと同じになります
　Vsync=1にしてもティアリング(ちらつき)が発生する場合は、
　FlushGpuCmdBuffer=1 と D3DMultiThread=1 と AutoBltPrepareTime=1 と ProcessPriority=2 を設定してみてください
　OSの設定で、電源プランが「高パフォーマンス」になっていない場合は、「高パフォーマンス」にして、
　CPUクロックが低下しないように設定してみてください



FlushGpuCmdBuffer (デフォルト=0)

　1にすると、画面を更新する直前に、GPUのコマンドバッファを強制的にフラッシュし、ただちにGPUに描画命令を送信するようにします
　LockBackBufferとよく似たオプションです
　LockBackBufferの効果が無い場合は、LockBackBufferの代わりにFlushGpuCmdBufferを試してください



LockBackBuffer (デフォルト=0)

　1にすると、画面を更新する直前にバックバッファをロックし、すべてのDirect3D描画命令の完了を待機します
　vsync=1時に、ティアリングが発生する環境では、LockBackBuffer=1にすることで正常にvsyncが行えるようになるかもしれません
　LockBackBufferの効果がない場合は、代わりにFlushGpuCmdBufferを試してください



BltPrepareTime (デフォルト=0)

　実際に画面に表示される何ミリ秒(ms)前に、
　裏画面に次のフレームを描画し始めるかを指定します
　0〜16の数字を指定してください

　例：BltPrepareTime=10を指定すると、10ms前にゲームループ(描画)を開始し、例えば3msで1フレームを描画できた場合は、
　残りの7msをsleepしてから、規定の時刻に画面を更新します

　1フレームを描画する時間はまちまちなため、多めの時間をBltPrepareTimeに設定すると、
　vsync=1の時にティアリング発生を少なくすることができます

　vsync=0の時は、BltPrepareTime=0でもかまいませんが、多めの時間を設定することで、
　常に一定のリズムで画面更新を行うことができます
　vsync=0なのでティアリングは発生しますが、常に同じリズムでティアリングが発生するようになることで、
　画面が見やすくなるかもしれません　　その代わり入力遅延がBltPrepareTimeに設定した値になります

　例えば、弾の多いシーンではゲームループ(描画処理)だけで5ms以上かかるので、BltPrepareTimeを4に設定したとしても、
　元から入力遅延は5ms存在しますので、BltPrepareTimeの設定で増える入力遅延は実質0です
　BltPrepareTimeの値の分、そのまま入力遅延が必ず増えるわけではありません

　最近のOSでは、GPUのコマンドバッファは画面を更新する際にフラッシュするようになっているため、
　画面を更新する前にsleepしても、GPUに命令が送信されずに無為に時間を費やすだけです
　BltPrepareTimeだけを設定しても入力遅延や描画遅延が増えるだけで効果はありません
　BltPrepareTimeを設定する場合は、FlushGpuCmdBufferを1にして強制的にGPUのコマンドバッファをフラッシュするように設定してください



AutoBltPrepareTime (デフォルト=0)

　0を指定した場合は、何もしません
　1を指定すると、描画完了時間の統計を取り、最適なBltPrepareTimeを自動でセットします
　AutoBltPrepareTimeを1以上にすると、この値のミリ秒分、自動算出された値に加算されます
　AutoBltPrepareTimeを設定する場合は、FlushGpuCmdBufferを1にしてください(BltPrepareTimeのヘルプに書いた理由と同じです)
　vsync=0の時は、AutoBltPrepareTime=0でかまいません
　vsync=1の時に、AutoBltPrepareTime=1を推奨します



D3DMultiThread (デフォルト=1)

　Direct3Dをマルチスレッドで動作させた場合に発生する不具合を無くすためのオプションです
　0の場合は、何もしません

　1の場合、IDirect3D9::CreateDevice() のBehaviorFlagsに、D3DCREATE_MULTITHREADEDを指定するようにします
　このフラグを指定すると、マルチスレッドでDirect3Dを使用する際に不正終了しなくなります

　vsync=1の時には、スキャンラインの位置を調査するスレッドを起動するため、このオプションの設定が必要です



FixSlowPauseScreen (デフォルト=1)

　1を指定すると、ゲーム中、一時停止画面が表示される際にfpsが大幅に低下する動作を修正するパッチを当てます
　startボタンを連打しても、おそらく60fpsをキープできると思います
　パッチの詳細は下記の通りです
　一時停止画面を生成する際、テクスチャーの色変換にD3DX関数が使用されており、
　その転送元にバックバッファが直接指定されています
　このD3DX関数は転送元SurfaceをLockしてピクセルを直接readするような実装のようです
　バックバッファをLockして直接readするのはとても遅いためfpsが異常に低下します
　パッチでは、バックバッファの内容をメインメモリに用意したSurfaceにコピーし、
　そのコピーしたSurfaceを代わりに転送元として指定しD3DX関数をcallします
　メインメモリに用意したSurfaceのLock＆readはとても高速に動作するため、
　fpsの低下はある程度押さえられます(CPU&GPUの性能に左右)



DisableChecksum (デフォルト=0)

　東方の実行ファイルであるth15.exeのチェックサムを確認するかどうかの設定です
　1を設定すると、チェックサムを確認せずにvpatchを適用し、東方を起動します
　通常はこのオプションを変更する必要はありません
　東方の実行ファイルに何らかの非公式パッチ(言語パッチ・不具合解消パッチ等)を当てた場合は、このオプションを1にしてください
　1に設定した場合、vpatchが正常に動作するかどうかはわかりません
　※vpatchが適用できない場合は、まず、ゲームのバージョンが対応verであるかどうかを確認してください



ProcessPriority (デフォルト=0)
　th??.exeのプロセスの優先度を設定します
　0 : 通常
　1 : 通常以上
　2 : 高
　3 : リアルタイム

ProcessAffinityMask (デフォルト=0)
　th??.exeのプロセスの関係(アフィニティ)を設定します
　数値は10進数で書いてください
　複数のCPUコアに関係付ける場合は足し算をしてください
　ここで設定した数値をSetProcessAffinityMask関数に渡します
　0 : 設定なし(すべてのプロセッサ)
　1 : CPU 0
　2 : CPU 1
　4 : CPU 2
　8 : CPU 3
　16: CPU 4

MainThreadPriority (デフォルト=0)
　th??.exeのメインスレッドの優先度を設定します
　0 : 通常
　1 : 通常以上
　2 : 高
　3 : タイムクリティカル

MainThreadAffinityMask (デフォルト=0)
　th??.exeのメインスレッドのプロセスの関係(アフィニティ)を設定します
　設定方法はProcessAffinityMaskと同じです

MainThreadIdealProcessor (デフォルト=-1)
　th??.exeのメインスレッドをどのCPUコアで優先的に実行するのかを設定します
　ここで設定した数値をSetThreadIdealProcessor関数に渡します
　-1 : すべてのCPUコア
　0 : CPU 0
　1 : CPU 1
　2 : CPU 2
　3 : CPU 3
　4 : CPU 4







■version履歴
2015/11/28
　・東方紺珠伝に対応
　・東方紺珠伝以外に対応したvpatchは同梱していません
　・ini追加:FlushGpuCmdBuffer
　　vsync=1の時にLockBackBuffer=1でバックバッファをロックしても手元の環境では効果が無かったため、
　　バックバッファをロックせずに、GPUのコマンドバッファをflushする別の方法を実装しました
　・ini追加:MainThreadPriority
　・ini追加:MainThreadAffinityMask
　・ini追加:MainThreadIdealProcessor
　　メインスレッド関連の設定を追加しました
　　vsync=1の際には、プロセスを実行するCPUコアを固定した方がティアリングが発生しにくいと思います
　　固定するのはメインスレッドだけでよいため、ProcessAffinityMaskで設定するよりも、MainThreadAffinityMaskかMainThreadIdealProcessorで固定すると良いでしょう
　・ini追加:FixSlowPauseScreen
　　640x480の場合は気になりませんが、1280x960画面の場合、一時停止画面表示時にfpsが大幅に低下するのが気になったので実装しました
　・ini:MagnificationMethodは今回は実装できていません
　・既知のバグ：FlushGpuCmdBuffer=1にしてフルスクリーンでゲームをした際、デスクトップに戻ってから、ゲームに戻ろうとするとゲームが固まる(又は異常終了する)
　　修正には少し時間がかかります
　　とりあえずFlushGpuCmdBuffer=0にするか、windowモードでゲームをするか、どちらかの選択肢をお試しください


■作者
◆swmpLV/75E

■連絡先
バグ等の御報告はこちらからどうぞ
http://ux.getuploader.com/swmplv75e/inquire
