captainys / TOWNSEMU

FM Towns Emulator "Tsugaru"
BSD 3-Clause "New" or "Revised" License
238 stars 17 forks source link

double buffered Sprite #33

Closed pinterior closed 2 years ago

pinterior commented 2 years ago

Works fine with ALLTYNEX stage4 boss (still have a small glitch due to lack of SPYS bit support), but not yet tested with tricky softs. (Shadow of the Beast, Genocide Square, Image Fight, etc)

captainys commented 2 years ago

Pull Requestありがとうございます!ただ、これはSPENに関わらずVSYNCごとにSpriteにScheduled Taskが入ったままになるように見えるのですが、SPENがオフの状態ではScheduleを使わないようになんとかならないですかね?Scheduled TaskはCPUがインストラクションをひとつ実行するたびにチェックしているので、できれば少なく抑えたいところなのですが。

ちなみに、これを書いている途中で、vmbase.h/cppのRunScheduledTaskがinlineになっていないことに気が付いてしまったので、Inline化しておきます。ちょっとスピードが上がるはず。

それから、Shadow of the Beastは、スプライト書きかけなのに既に書き終わったはずと見当をつけてSPENをオフにしてしまうということをやっているので、書き換えサイクルの途中でSPENがオフになったらその時点でスプライトをVRAMに書き込む処理を入れないと多分動かなくなるように思います、と、ここまで書いた段階で、本当にダブルバッファになるんだったら、書き換えサイクルの最初に書き込んでしまえばいいのではないかと思ったのでこっちはなんとかなりそうですね。

captainys commented 2 years ago

あ、そうか。電源投入時からかかりっぱなしにする必要があるのであれば、Scheduled Taskを経由せずに別途毎回呼び出すようにすればいいのか。これは、1/60単位だから、1/1000秒の精度があれば十分過ぎるぐらいですよね? そうであれば、ProcessSoundと同じ頻度でチェック(ProcessSpriteみたいな)すれば十分かな。そう考えると前からそうしておけばよかった気がしてきた。とりあえずMergeしてそのように書き換えようかな。

pinterior commented 2 years ago

直したのをpushするので少々お待ちください…(動作確認中)

pinterior commented 2 years ago

電源オンではスケジュールせず、以下の場合にスケジュールするようにしました。

定期的なチェックで十分かどうかはわかりかねます。 プログラムから見えるVSYNCとSPD0のセット、PAGEのフリップが十分同期するならよいのですが、ミリ秒単位ではどうでしょうか。 BBSで挙げられていたGenocide2などが不安に思います。

captainys commented 2 years ago

おお、速い!ありがとうございます!Mergeさせていただきます!Genocide 2はVSYNCの最初にSPENがReadyになるか、最後になるかの違いだったように記憶しているので、多分大丈夫な気もしますが、必要のあるときのみScheduleが入るのであれば敢えてProcessSoundと同列の専用のチェックを入れる必要は無さそうですね。