2015年11月10日火曜日

HSP3Dishのミリ秒時間取得について

こんばんは、セルディアです。

今回は読み物です。長い。

ミリ秒を測りたい


HSP3Dishのコードを書いていて、処理時間を計測するためにミリ秒を取得したくなったので、とりあえずgettime(7)を使ってみました。しかし、Windows上ではちゃんと計測できるのに、Androidでは妙に数字が小さい。よく調べてみると、なぜかgettime(7)の値が0~100の間でしか動かない。

なぜか1/100秒の精度しかない…。

まさかAndroidではミリ秒精度のタイマーがないのか? と思いましたがそんなことはありませんでした。

HSP3Dishではgetreqという命令が用意されており、これでミリ秒を取得することができます。1ミリ秒ごとに1加算されるので、処理時間計測などに有効な値となっています。(Windows APIのtimeGetTime関数みたいに使えます)

逆にこれをHSP3Dish限定ではなく通常のHSPにも標準実装してほしいんですが…。

ミリ秒を測って、オートフレームレートを実装したい


なんでミリ秒を測りたかったかというと、処理時間によって描画fps(1秒に表示する回数)を60にしたり30にしたり、処理落ちによってゲーム速度・テンポを落とさず描画だけ頻度を落としたかったからです。

昔から、高スペックを要求するゲームでもオプションでfpsを変更できたり、3Dゲームではフレームレートがスペックによって自動的に上下したりしますが、あれを実装するのは割と大変です。

例えば、プレイヤーを上下左右に動かす処理は常に1秒に60回処理するとしても、プレイヤーを画面に表示するのは1秒に60回だったり、30回だったりするわけです。動かす処理と、表示する処理を完全に分離する必要があります。

うっかりミスで表示する処理に動かす処理を混ぜ込んでしまったり、表示する処理が実は裏で常に60回動いていたり…(後者は特に気づきづらい!)

オートフレームレートでも問題は残る


うまくオートフレームレートを実装して、処理落ちによるゲーム速度・テンポの低下が防げても、実は一つ問題が残っています。
それは、入力速度の低下です。上手にオートフレームレートを実装しても、入力を取得できるタイミングは、描画頻度に影響します。(30fpsで画面を表示しているときには、描画に1/30秒弱かかっています。そんなときに、1/60秒の頻度で入力を取得できるわけがないのです)
アクションゲームやシューティングなど、入力の精度が要求されるゲームでは、描画が遅いからといってこの手法はあまり使えません。

結局のところオートフレームレートは必要なの?


WindowsとAndroidで同じプログラムを動かしてみましたが、Windows上では1ミリ秒もかかっていない処理が、Android上では1/60秒以上かかっていました…貧弱ゥ!
がんばって実装しました。

0 件のコメント:

コメントを投稿