秒間フレーム数計測

(サンプル一覧を表示する)

FlashDevelop を使って、秒間フレーム数(FPS)を計測してみました。

enterFrame イベント内でフレーム数を足して行き、1 秒 (1000 ミリ秒) 経過するごとに
テキストフィールドの数字を更新しています。
Flash の実行画面
秒間フレーム数計測

Flashプレーヤーが入っていないか、JavaScriptが無効になっているようです。

Get Adobe Flash player

秒間フレーム数計測

ソースコード

package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.text.StyleSheet;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFormat;
	import flash.utils.getTimer;
	
	/**
	 * FPS 表示テスト
	 * @author Hikipuro
	 */
	public class Main extends Sprite 
	{
		/**
		 * FPS 計測用
		 */
		private var fps:int = 0;
		
		/**
		 * 1 秒計測用
		 */
		private var time:int = 0;
		
		/**
		 * FPS 表示用
		 */
		private var textField:TextField;
		private var textField2:TextField;
		
		/**
		 * コンストラクタ
		 */
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		/**
		 * 初期化メソッド
		 * @param	e
		 */
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			
			// フォントサイズ 30 のテキストフォーマットを作成
			var textFormat:TextFormat = new TextFormat();  
			textFormat.size = 30;
			
			// FPS の数字部分のテキストフィールドを作成
			textField = new TextField();
			textField.x = 20;
			textField.y = 20;
			textField.selectable = false;
            textField.defaultTextFormat = textFormat;
			textField.text = fps.toString();
			addChild(textField);
			
			// フレーム/秒を表示するテキストフィールドを作成
			textField2 = new TextField();
			textField2.autoSize = TextFieldAutoSize.LEFT;
			textField2.x = 60;
			textField2.y = 20;
			textField2.selectable = false;
            textField2.defaultTextFormat = textFormat;
			textField2.text = "フレーム/秒";
			addChild(textField2);
			
			// 1 秒を計測するタイマーの初期値を設定
			time = getTimer();
			
			// フレーム開始イベントの設定
			addEventListener(Event.ENTER_FRAME, enterFrame);
		}
		
		/**
		 * フレーム開始イベント
		 * @param	event
		 */
		private function enterFrame(event:Event):void
		{
			fps++;
			
			// 1 秒経過したら、FPS の数字を更新して 0 にクリアする
			var now:int = getTimer();
			if (now - time >= 1000) {
				textField.text = fps.toString();
				time = now;
				fps = 0;
			}
		}
		
	}
	
}		

サンプルは、60 フレーム毎秒になるように設定していますが、
実行環境によっては 60 と表示されない場合があります。

IE と、FlashPlayer 9 以前の組み合わせだと、Object タグのパラメータが無指定の場合、
コンピュータの性能に関係なく 40 フレーム程度しか出ない可能性があります。

FlashPlayer 10 をインストールすると、IE でも秒間 60 フレーム出るように改善されるようです。
FlashPlayer 9 以前のバージョンで実行できないようにすると
秒間フレーム数の差異を無くすことができそうですが、
FlashPlayer 10 に環境を絞ってしまうと、今のところ(2008年12月現在)、
実行できないコンピュータが多数出てきてしまいます。

9 以前の環境でも、 HTML 上のパラメータの指定によって
60 フレームに近い数字を出すテクニックはあるので、
状況を見て、ターゲット環境となるバージョンの選択をしてください。

FlashPlayer 10 が入っている環境でも、コンテンツの内容とコンピュータの性能によっては
CPU の処理が追いつかず、低いフレーム数となってしまう場合があります。
また、ブラウザ以外のウインドウで動画エンコード等、
CPU 負荷のかかる処理が動いている場合は Flash に入れる処理が軽い場合でも、
コマ落ちして表示されることもあります。

Flash の場合、フレーム数をどのような状況でも同じにするというのは不可能です。
秒間フレーム数の調整は時間のかかる作業になると思うので、
作成しようとしているコンテンツ全体の種類や雰囲気、
フレーム調整を入れるシーンによって どれほどの精度のフレーム数が必要なのかということと、
どういったユーザがどういった状況で Flash を実行させているのかを考えて、
丁度良い調整バランスを見つけてください。

外部リンク