Ootakeでは、2つの作戦で、操作遅延を解消(軽減)しています。
1つ目の作戦は・・・
「ジョイパッドの状態を見る命令」が来たら、常に「そのときの最新のWindowsジョイパッド入力状態」を取得(更新)している。
です。
おそらく、多くのエミュレータでは、1フレーム(1/60秒)に1回だけ「Windowsのジョイパッド入力状態」を取得しているため、その取得直後のタイミングでジョイパッドを入力した場合、最大1フレームぶん入力が遅れることになります。
それを上記の1つ目の作戦(入力を見る命令が来たら、常に状態を取得)を使うことで、この問題での遅延は解消できます。
ただし、この作戦は、ゲームによって(入力待ちが多いゲーム)は処理が「かなり重く」なってしまい、実用的な速度が出せません。
そこで、Ootakeでは、連続で「ジョイパッドの状態を見る命令」が来た場合、「Windowsのジョイパッド入力状態」の取得する回数を制限する仕組みを入れています。
具体的には、「Windowsのジョイパッド入力状態」の取得したら、そのときに「処理中だった走査線ラインNo.」を記録しておいて、次に「ジョイパッドの状態を見る命令」が来たときに「まだ同じ走査線ラインNo.での処理中」だった場合は、「Windowsのジョイパッド入力状態」の取得を省きます。
(つまり、「1ラインに1回」が最も多いの取得(更新)回数となります)
こうすることで、反応が充分に早く、かつ処理が重くなりすぎないように対策しています。
※それでも、この処理でエミュレータはだいぶ重くなります。それでも、「作品の楽しさを損なわないため」には必要な処理と思っています。
2つ目の作戦は・・・
エミュレートする処理を「約1/240秒(1/60秒を4分割)」単位で区切ることで、「実機での時間経過状態」に近づけている。
です。
エミュレータを動かしたときに、性能が高く「処理速度に余裕があるパソコン」の場合、下図(1/60秒間の流れ)のように
->[ エミュレート処理 ]->[ V-Sync信号が来るまでお休み ]->[描画処理]->(先頭へ)
となって、「V-Sync信号が来るまでお休み」する時間が長くなります。(逆に、「性能がギリギリのパソコン」の場合、この「お休み」が少なくなり「エミュレート処理」の時間が長くなります)
この「お休み」の時間はジョイパッドの入力判定を行うことはできないので、「お休み」の時間が多い「処理速度に余裕があるパソコン」ほど、ジョイパッドの入力可能期間が狭くなり、1フレーム遅れて入力されてしまう原因になります。そこで下図(1/60秒間の流れ)のように
->[エミュ]->[休]->[エミュ]->[休]->[エミュ]->[休]->[エミュ]->[休]->[描画処理]->(先頭へ)
として、約1/240秒毎に休みを入れる(休みを1度にせずに分割する)ことで、実機に近い時間経過の流れを作り、ジョイパッドの入力判定も遅れないようにしています。
また、実はジョイパッドの反応だけでなく、「休み」が少なく「性能がギリギリのパソコン」でのエミュレート処理のほうが、「実機での時間経過の状況」に近いため、エミュレートの精度(タイマ割込みや、それを利用した内蔵音源BGM等)も高まります。
ですので、Ootakeでは上記の作戦で、 「処理速度に余裕があるパソコン」でも、「性能がギリギリのパソコン」に近い動き(=実機の時間経過に近い動き)になるような仕組みで動かしています。特にPSG(波形メモリ+ノイズ)の音色の再現に、このことは重要となっています。
※Ootakeの"Volume"メニューで"Light PSG"を選んでいる場合は、通常の1/60秒毎の動作になります。
|