【Unity】フレームレートを上げるとバッテリーにも影響が出る
以前、フレームレート(FPS)について処理時間の観点からお伝えしたのですが、FPSはバッテリーにも影響があるのでこの点にも注目してみましょう。
フレームレートが高いと処理負荷も高くなることから、それだけCPUが消費する電力も大きくなります。スマホで演出のしっかりしたアプリを遊んだ時、スマホ自体が熱くなったことはありませんか? あんな感じでCPU自体が熱を持つくらいに一生懸命処理を行っているんですよね。
そしてその分使われる電力はバッテリーから供給しています。スマホや持ち運びできるゲーム機(Nintendo Switchなど)はバッテリーについても気にする必要があります。
バッテリーは有限のリソース
スマートフォン向けのゲームだと、ゲームのサイズ、データ転送量の他にバッテリー消費についても考えないといけません。コンセントにつないでいるPC向けゲームや家庭用ゲーム機向けゲームと異なり、スマートフォンや携帯ゲーム機向けのゲームではバッテリーは有限のリソースです。
ゲームを遊んでもらいやすくするためにはできる限りバッテリーを長持ちさせたいところですが、フレームレートの観点からゲームのクォリティとトレードオフの関係になっています。
例えば30FPSならバッテリーは長持ちしますが、その分演出などはちょっとカクカクしているかもしれません。特にアクションゲームだと一瞬のラグが命取りになってしまうんですよね。30FPSの場合1フレームの処理時間は約33.3ms、60FPSなら1フレームの処理時間は約16.7msと、ボタン入力を検知する間隔が倍程度異なっているので、演出面以外でも気をつけないといけません。
逆に60FPSならこうした面はクリアできるものの、フレームレートが大きくなるとCPUでの処理負荷が大きくなり、それに伴ってバッテリー消費量も上昇します。スマホのゲームではスマホ自体を手に持って操作を行うことから、CPUの処理負荷上昇に伴って温度が上がり、操作するときに熱さが気になる……ということもあります。
バッテリー消費量の目安
以前自分の持っているスマホで実験したのですが、自分で作ったアプリで30FPSと60FPSの場合でバッテリー消費量を比較しました。
30FPSでは10分で1~2%減る程度だったのに対し、60FPSでは10分で7~8%程度バッテリーを消費しました。(画面に表示されている残りバッテリーの数字を見て記録したものなので、正確な数字でないのはご容赦ください)
FPSを2倍にするとバッテリー消費量は2倍どころか4倍にまで膨らんでいました。1秒間に呼ばれるフレームの数が倍になるからといって、単純に比例で消費量が上がっているわけではなく、二次関数的に消費量が上昇する可能性があります。このデータはもちろんサンプルが少ないので正確な法則は見出せませんが、少なくともFPSが増えるとバッテリー消費量が増える、というのは感じられます。
ジャンルに応じたFPSのチューニング
滑らかに動かすためにはFPSを上げたいところですが、それによってバッテリーの消費量が上がってしまうのは痛いところです。
ゲームのジャンルに応じて適切なFPSが変わりますが、プラットフォームによる制約も考えておくと良いでしょう。
例えば上でもちょっと触れたアクションゲームであれば、60FPSでプレイヤーの入力を拾っておきたいところです。そうすると、結構バッテリー消費が激しくなるので外で遊ぶには大変かもしれません。となると、家で遊ぶのがメインになるので、ある程度1ゲームの時間が5分とか10分といった感じに長くなってもいいかもしれません。
60FPSだけど外で遊んでもらいたい! とかだったら1ゲームあたり短い時間で終わるような仕組みが良さそうです。1分、2分で1ゲームが終わるようにすると、例えば外で友達を待っている間にちょっとだけ時間を潰す、みたいな遊び方ができますし、待ち合わせの連絡を取るためのバッテリーに与える影響を減らすこともできます。
あとはレースゲームなんかも60FPS欲しいですね。3Dのレースゲームだと頂点数やマテリアルも多くなり、処理負荷が大きくなりますから、結構バッテリーを使うことが予想されます。こちらもコース1周あたりの長さを調整するのも大切ですね。
また、プレイヤーが考えている時間が長くなるようなパズルゲームなどであれば、ある程度FPSを落としても良いでしょう。通常のプレイングは30FPSにしておいて、クリア時の演出だけ60FPSにする、ということもできます。
このようにジャンルによって適切なFPSが異なること、プレイヤーが遊ぶ場面によってもFPSを変えた方が良いこともあるので、あなたが作ろうとしているゲームのジャンルについてこうした面でも検討してみると良いと思います。
場面ごとにFPSを変える
もし画面のリフレッシュレートと同期させずに自分でフレームレートを指定する場合は、スクリプトから値を設定できます。これを使って、演出のある場面では60FPSにセットし、プレイヤーが考えながら操作を行うステータス画面などでは30FPS、あるいはもっと下げて15FPSにする方法もあります。
このアイディアは『テラシュールブログ』さんにあったものです。
私が自分で作ったアプリ(ぼく猫ですって)でもこの方法を使っていて、キャラクターの装備を変える場面やスキルをセットする場面では15または30FPS、装備を変更して画面を閉じるときにウィンドウがアニメーションする際に60FPSにして消えたらまた30FPSに戻す、なんてやっていました。
他にもシーンごとにFPSを変えていて、戦闘シーンはほんのりアクションRPG風味にしたので60FPSにしていました。
フレームレートをスクリプトから変更する場合は、以下のようにします。
このサンプルでは分かりやすくStart()の中で記載していますが、Awake()に記載する方がもっと良いかもしれません。(先述のアプリではシーンで適用する場合はAwake()の中に書きました)
他にも処理の途中で変更してセットすることもありました。いろいろな場所でフレームレートの値を変える際、いちいち数字で指定すると変更があったときに直すのが辛いので、staticなクラスにconstのフィールドを定義して定義値を使って指定していました。これなら変更するのは1箇所で済みますからね。
まとめ
可能ならストップウォッチを用意して、FPSを変えてバッテリー消費量を測定してみることをおすすめします。
とはいえ2019年、2020年に発売されたスマートフォンであればバッテリーの容量も大きくなっているので、60FPSでもある程度耐えられるとは思います。(データを取ってないので主観的な感想です。ご注意ください。)
ターゲットがバッテリー駆動の端末の場合、バッテリーへの影響も考えながら適切なFPSを考えてみてください。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】フレームレート(FPS)と処理時間の関係【ゲーム開発】 2020.08.19
-
次の記事
【ゲーム作り】厨二病の頃に考えたことは作るゲームのネタに 2020.08.21
コメントを書く