[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[WitchTech 00636] 75fps と定速動作



うえけんです。

スワンは確かに秒間75フレームのようなことが書いてあります。
80186 互換3MHzの貧弱CPUにしては、結構きついスペックだと
思います。

ゲーム機なんかは60フレームを基準に設計してあることがほと
んどですので、1ループを1/60秒で処理すればいいわけです。
スワンはCPUが遅い上に1/75秒で1ループを処理しないと
いけないので、処理時間的に厳しくなっています。

そこで、Vブランク待ち関数を探してみたら・・・ないですね。
ちゃんちゃん。じゃなくて、どうやらsys_waitを使えということ
のようです。でも重い処理を複数Vブランクに分割して処理する
場合これではまずいことがあります。

1ループを「ジャスト2ブランク」で一定にしたい、という場合、
sys_waitでは正確に処理時間を設定できません。あるループでは
処理がぎりぎり間に合って2Vですんだけど、時々オーバーして
3Vかかるという現象が起きて、動作がカクカクしてしまいます。

ではどうするかというと、

1.volatile int(まあcharでもいいですが)のグローバル変数
  を1個用意する。これはVブランクカウンタとして使う。
2.初期化で0クリアしておく
3.Vブランクコールバック関数を登録する。コールバックの中
  では、Vブランクカウンタを+1するだけ。
4.ゲームループに入る。
5.ゲームのループエンドで、指定Vブランク経過したかどうか
  をチェックする(Vブランクカウンタの数値を見る)。
6.1ループに費やすカウント分Vブランクカウンタが増えたら
  ループの頭に戻る。

という処理をすれば、画面を乱さずに1ループを複数Vブランク
で処理できるはずです。たとえば1ループに4フレームかけると
すると、Vブランクカウンタと0x03の&をとって、0ならループ
の先頭に戻る、というような処理で行けるのではないかと。

実は多忙にかまけて、買ったはいいがぜんぜんいじっていません
でした。改めてマニュアルを調べてみると、言っちゃなんだけど
ライブラリが貧弱ですね。特に画面制御系が弱いような気がしま
す。もうちょっとユーザレベルで細かくいじれるように整備して
くれるといいんですが。


ML Archives