FC2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム » Unity »【Unity】【C#】FPS(フレームレート)をリアルタイムに測定して表示するv2(4隅選択可能で、画面サイズの変更にも対応版)

【Unity】【C#】FPS(フレームレート)をリアルタイムに測定して表示するv2(4隅選択可能で、画面サイズの変更にも対応版)  



※「UI-Text(uGUI)版」は>>こちら

 約1年と少し前(当時:Unity 5.1.2f1)、UnityPlayer が旧プラグインとされ、サポートが終了となり、WebGL に移行しようと試してみたが、まだ HTML5(WebGL)出力はβ版だった事もあり、動作は非常に重くファイルサイズも巨大となり、とても実用的とは言えなかった。

 しかし最近(掲載時点:Unity 5.4.3f1)ではパフォーマンスも改善され、ファイルサイズも随分と小さくなり、十分に使えるレベルになったので、色々試してみようと Unity4 時代に作ったサンプルなどを Unity5 に読み込んで試してみている。

 ただ、残念ながら100%互換とは行かないみたいだね。見た目は多少目をつぶるが、動きはある程度の速度が出ないと操作性や快適さに関わるので、実験するにあたって、以前に作った「簡易FPSモニタ」は欠かせないアイテムとなった。以前のバージョンは一定位置固定で、自分なりに定数を書き換える仕様になっていたが、実は簡単に4隅を選択して配置できるバージョンも作ってある。手軽に使えるアイテムとして載せておこう。

●リアルタイムにFPSを測定して表示するv2(4隅選択可能で、画面サイズの変更にも対応版)
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

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

//測定用
int tick = 0;
float elapsed = 0;
float fps = 0;

//表示基準位置用
public enum Alignment
{
LeftTop, //画面左上
RightTop, //画面右上
LeftBottom, //画面左下
RightBottom, //画面右下
}

public Alignment alignment = Alignment.LeftTop;

//外観設定(デフォルト値)
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外枠からの縦マージン

//オフセット位置(MARGIN_X, MARGIN_Y)ユーザー設定用
public Vector2 offset = new Vector2(MARGIN_X, MARGIN_Y);
public bool boxVisible = true; //囲みボックスの可視フラグ
public float boxWidth = GUI_WIDTH; //囲みボックスの幅
public float boxHeight = GUI_HEIGHT; //囲みボックスの高さ
public Vector2 padding = new Vector2(INNER_X, INNER_Y);

float x, y; //表示位置
Rect outer; //外枠(GUI矩形領域)
Rect inner; //内枠(文字領域)

//画面サイズ変更チェック用
int oldScrWidth;
int oldScrHeight;


// Use this for initialization
void Start () {
oldScrWidth = Screen.width;
oldScrHeight = Screen.height;
LocateGUI();
}

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

void OnGUI () {
//画面サイズ変更チェック
if (oldScrWidth != Screen.width || oldScrHeight != Screen.height) {
LocateGUI();
}
oldScrWidth = Screen.width;
oldScrHeight = Screen.height;

//fps表示
if (boxVisible) {
GUI.Box(outer, "");
}

GUILayout.BeginArea(inner);
{
GUILayout.BeginVertical();
GUILayout.Label("fps : " + fps.ToString("F1"));
//↓たまに極端に大きな値が出るので使い勝手が悪い
//GUILayout.Label("fps : " + (1f / Time.deltaTime).ToString("F1"));
GUILayout.EndVertical();
}
GUILayout.EndArea ();
}

//表示位置を計算する
void LocateGUI() {
x = GetAlignedX(alignment, boxWidth);
y = GetAlignedY(alignment, boxHeight);
outer = new Rect(x, y, boxWidth, boxHeight);
inner = new Rect(x + padding.x, y + padding.y, boxWidth, boxHeight);
}

//横位置の計算
float GetAlignedX(Alignment anchor, float w) {
switch (anchor) {
default:
case Alignment.LeftTop:
case Alignment.LeftBottom:
return offset.x;

case Alignment.RightTop:
case Alignment.RightBottom:
return Screen.width - w - offset.x;
}
}

//縦位置の計算
float GetAlignedY(Alignment anchor, float h) {
switch (anchor) {
default:
case Alignment.LeftTop:
case Alignment.RightTop:
return offset.y;

case Alignment.LeftBottom:
case Alignment.RightBottom:
return Screen.height - h - offset.y;
}
}
}

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

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

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

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

 内容的には以前と同じで、指定した4隅の位置や画面サイズの可変に対して、描画位置を再計算するだけのものなので、難しくはないだろう。あくまで手軽に表示位置変更できるようにしただけのバージョンである。


(関連記事)
【Unity】【C#】UI-Text 版 FPS(フレームレート)をリアルタイムに測定して表示する
【Unity】【C#】FPS(フレームレート)をリアルタイムに測定して表示する
【Unity】【C#】独自のギズモ(Gizmo)を表示する
【Unity】【C#】インスペクタの表示項目を動的に変更する


スポンサーサイト

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  C#  サンプル 
tb: 0   cm: --



トラックバック

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

プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop