ヽ|∵|ゝ(Fantom) の 開発blog? ホーム » Unity »【Unity】【C#】FPS(フレームレート)をリアルタイムに測定して表示する

【Unity】【C#】FPS(フレームレート)をリアルタイムに測定して表示する  


 UnityPlayer が旧プラグインとされ、もうすぐサポートが終了するというので、WebGL に移行しようと考えているのだが、Unity5 のWebGLPlayer で出力していると重く感じる。そんなわけで超簡単なフレームレートの測定値をモニタできるスクリプトを作ってみた。

※「4隅選択可能で、画面サイズの変更にも対応版」は>>こちら


●リアルタイムにFPSを測定して表示する
using UnityEngine;
using System.Collections;

/**
* フレームレート測定モニタ
*/
public class FpsMonitor : MonoBehaviour {

//測定用
int tick = 0; //フレーム数
float elapsed = 0; //経過時間
float fps = 0; //フレームレート

//外観設定
const float GUI_WIDTH = 75f; //GUI矩形幅
const float GUI_HEIGHT = 30f; //GUI矩形高さ
const float MARGIN_X = 10f; //画面からの横マージン
const float MARGIN_Y = 10f; //画面からの縦マージン
const float INNER_X = 8f; //文字のGUI外枠からの横マージン
const float INNER_Y = 5f; //文字のGUI外枠からの縦マージン

Rect outer; //外枠(GUI矩形領域)
Rect inner; //内枠(文字領域)

// Use this for initialization
void Start () {
outer = new Rect(MARGIN_X, MARGIN_Y, GUI_WIDTH, GUI_HEIGHT);
inner = new Rect(MARGIN_X + INNER_X, MARGIN_Y + INNER_Y, GUI_WIDTH - INNER_X * 2f, GUI_HEIGHT - INNER_Y * 2f);
}

// Update is called once per frame
void Update () {
tick++;
elapsed += Time.deltaTime;
if (elapsed >= 1f) {
fps = tick / elapsed;
tick = 0;
elapsed = 0;
}
}

void OnGUI () {
GUI.Box(outer, "");
GUILayout.BeginArea(inner);
{
GUILayout.BeginVertical();
GUILayout.Label("fps : " + fps.ToString("F1"));
GUILayout.EndVertical();
}
GUILayout.EndArea();
}
}

 使い方は Main Camera や Directional Light 等、ずっと使われているものにスクリプトを追加しても構わないし、空の GameObject を配置しておいて、それに追加しておくのも良いだろう。GUI を使っているので、どこかに GUI Layer が追加されている必要がある(大抵は Main Camera にはじめから組み込まれている)。

 また、測定方法は更新されたフレーム数を1秒以上経過したとき、その経過時間で割る方式にしているが、以下のように、1秒を毎デルタタイムで割る方法もある。

GUILayout.Label("fps : " + (1f / Time.deltaTime).ToString("F1"));

 しかしやってみると、表示が速すぎて見づらいのと、たまに極端に大きい値(350fpsとか)が出るようなのでやめた。超詳細なフレームレートを測定したいのなら、検討するのも良いだろう。


 残念ながら、現時点(Unity 5.1.2f1 Personal で確認)では WebGL 出力すると、ファイルが巨大化するので、個人用途で使うには無理そうだ。どうやら WebGLPlayer 自体(Unity 3Dエンジン自体?)もファイルに含まれているらしく(_WebGL.js?)、例えば、今まで作った最小のもの:1.5MB のものでも、WebGL にすると 144MB 行ってしまい、サーバーのファイルアップロード制限(私の借りている無料のレンタルサーバの制限)に引っかかってしまい、アップロード自体できなかった(故に WebGLPlayer でのサンプルは断念)。

 また、私は Windows 8.1 から Windows 10 の無料アップグレードをやってみたが、WebGL はかえって Windows 10 の方が重くなるようだ(これはたまたま私の環境のせいかもしれないが)。

 あと、WebGL はブラウザで実行速度が違うらしく、Firefox が一番速いと聞いていたのだが、私の場合はそうでもなかった。どちらかというと、

 Chrome > Firefox > Microsoft Edge (※左にある方が速い)

 という感じだった。

 まぁ、現時点(Unity 5.1.2f1)では WebGLPlayer はβ版なので、データとエンジン部分を分けてダウンロードできるようにしたり、js スクリプトを圧縮してファイルサイズを小さくしたり、パフォーマンスそのものを最適化したり等、改善されないと使うには厳しそうだ。今後のバージョンアップを期待するとしよう。


(関連記事)
【Unity】【C#】FPS(フレームレート)をリアルタイムに測定して表示するv2(4隅選択可能で、画面サイズの変更にも対応版)
【Unity】【C#】独自のギズモ(Gizmo)を表示する
【Unity】【C#】インスペクタの表示項目を動的に変更する


スポンサーサイト

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  C# 
tb: 0   cm: --


トラックバック

トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/187-b630eb79
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop