花映塚用VsyncPatch

adonis rev5 test版で対戦し、保存したリプレイファイルが
正常に再生できない場合 (同期ズレする場合)
本VsyncPatchを使用すると、正常に再生することが可能です
基本的な使用方法は、VsyncPatch rev6と同じです
使用方法の詳細は、rev6のreadmeを御覧下さい


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


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


■iniファイル
[Option]
FpuPatch (デフォルト=1)
　1の場合、浮動小数を演算する制御フラグ(コントロールワード)を変更します
　多くの環境では、この変更は必要ありませんが、
　古い環境(CPUが無印Athlon等)の場合、新しい環境(AthlonX2等)とはフラグが違うことがあります
　このオプションは、新しい環境と同じフラグを適用するオプションです
　このオプションを使用して保存したリプレイは、
　新しい環境では、vpatch無しでも正常に再生できます
　※ここでは便宜上、古い環境・新しい環境と記述していますが、
　※フラグが変わる正確な理由は判明していません (新古関係なく、ダメな環境があります)


■ゲームパッドの軸の遊び等について
以下が、花映塚本家のパッドの処理です

・PADが2つ接続されている場合に限り、DirectInputでPADの状態を取得する

・PADが1つしか接続されていない場合は、custom.exeの
　「パッドの入力にDirectInputを使用しない」の設定に関係なく
　必ずjoyGetPosEx(非DirectInput)でPADの状態を取得する

・custom.exeの「パッドの入力にDirectInputを使用しない」の設定は、
　PADが2つ接続されている場合に限り、参照される

・DirectInputで取得する場合は、th09.cfgからパッドの遊びの設定がloadされる
　th09.cfgのdefaultの遊びの設定は600　※custom.exe上からは設定不可能

・joyGetPosEx(非DirectInput)で取得する場合の遊びは、th09.cfgの設定に関係なく500固定である

・いずれの取得方法でも、POVは参照されない
　X軸とY軸のみが参照される

つまり、PADの接続数によって遊びの値が変わるため、
環境によって、若干、操作感が変わることがあります

custom.exeの「パッドの入力にDirectInputを使用しない」にチェックを入れた場合は、
PADの接続数に関係なく、遊びが500に設定されるので、こちらをおすすめします

現状ではまだですが、
adonis rev5で採用しているパッドの独自処理をvpatchに導入する予定です


■ハードウェア垂直同期をonにした時に感じる入力遅延について
custom.exeの「垂直同期を取らない」にチェックを付けない場合の本家の動作について下記に記します

花映塚内部のメインループは、60.00fpsで固定です
モニタのリフレッシュレートが60.00Hzの場合は、特に問題が出ることはないのですが、
60.00ぴったりの環境は、かなり少ないと思われます

・モニタのリフレッシュレートが60.00を超える場合(例えば60.20Hz)
メインループレートが、リフレッシュレートよりも遅いため、たまにフレームスキップすることがあります
このため、かくつきを感じることがあります
入力遅延については、映像が作成されたらすぐにモニタに映像が転送されるため
遅延は割と少なく感じる人が多いかもしれません(多くても1フレーム＋αの遅延)

・モニタのリフレッシュレートが60.00を下回る場合(例えば59.80Hz)
メインループレートは、リフレッシュレートよりも速いため、
フレームスキップすることなく、なめらかに描画されます
ただ、メインループが速すぎるため、常にモニタへの画像転送が遅れ、その結果
入力遅延がかなり発生するものと考えられます(多ければ3フレーム＋αの遅延)
※ドライバのレンダリング前最大フレーム数の設定によって入力遅延が変わることがあります

※上記の情報は、花映塚限定です
※作品によっては、メインループレートが無制限(wait無し)のものもあります


■モニタのリフレッシュレートについて
モニタのリフレッシュレートの細かい設定は、モニタのハードウェア内部にEDIDとして保存されています
この値は、OSのプラグアンドプレイで読み取られ、ビデオカードドライバに伝えられます
つまり、EDIDのデータのvertical refresh rateが60.00Hzではないため、
垂直同期をonにした場合に、60.00fpsでゲームができないのです
※正確には、vertical refresh rateのデータがEDIDに直接書かれているわけではなく、
※ActivePixelsやFrontPorch等の細かいデータがたくさん書かれてあります

垂直同期をonにしつつ、60.00fpsでゲームをしたい場合は、
EDIDを上書きできるツールを使用する方法があります

・モニタ内に保存されているEDIDそのものを変更して、モニタのハードウェア内部に上書き保存する方法
・OS側で読み取られたEDIDのデータを、OS上でソフトウェア的に変更する方法
等があるようです

EDIDは、PowerStripというツールで変更できるようです
EDIDの変更によってモニタにダメージを与えたり、映像が映らなくなることもあるようですので
EDIDの変更はくれぐれもご注意ください

ビデオカードドライバのカスタム解像度の設定でも、ActivePixelsやFrontPorch等の
細かい設定ができるものもあるようですが、設定通りにうまく反映されないドライバもあるようです
そのような場合でも、PowerStrip上からは正常に変更できるようです

※EDIDを変更しても、DirectXのフルスクリーン上で変更された値が適用されるかどうかはわかりません
※windowモード＆vsync on設定で60.00fpsでゲームができるのは確認できました


■version履歴
2010/02/06 test1
　●vpatch rev6からの変更点
　・ini項目更新：Vsync
　　→Vsyncが-1の場合、custom.exeで設定した垂直同期の設定で動作します
　　→この場合、フレームレート制御はvpatchでは制御せず、本家の動作のままです(常にCPU100%)
　　→vpatchを起動しても、custom.exeで設定した垂直同期の設定をoffに強制変更して保存しないようにしました
　・ini項目更新：AllowShortDelay
　　→描画の遅れを取り戻す際、フレームレートを速くしすぎないようにして、
　　→フレームスキップ感をできるだけ感じないようにしました
　・ini項目追加：FpuPatch
　　→adonis rev5 test版で保存したリプレイを同期ズレせずに再生できます
　・ini項目削除：CalcFPS
　　→iniのVsyncの値が0以上の場合、常にCalcFPS=1にします
　　→iniのVsyncの値が-1の場合、常にCalcFPS=0にします
　・使用するフレームレート制御ライブラリをadonis rev5 test版と同じものに更新
　・vsync on時：毎フレーム調査している、現在のスキャンライン位置の取得方法を変更
　　→スキャンライン位置を正確に取得できるようにしました
　　→以前は、一度スキャンライン位置の取得に失敗すると、
　　→それ以降、vsyncを失敗し続けることがあったのが直ります
　・リプレイ保存時にメモリアクセス違反で花映塚が不正終了することがあったのを修正
　　→storyプレイ時、長時間プレイしていると、リプレイ保存時に落ちることがあったのがたぶん直ります
　　→メモリアクセス違反が起こる正確な条件は把握できていません
　　→「長時間」がフラグっぽいようですが、長時間プレイしても問題なく保存できる環境もあるようです

