07.描画速度の計測
06.で作成したモデルビューアに、描画速度を表示する機能を付加します。
解説
1回のフレーム描画にかかった時間を計測し、描画速度を画面に描画します。
時間の計測は、System.currentTimeMillis 関数で行います。
計測結果の描画速度値の画面への描画は、OpenGL ES の描画として行います。画面に表示される描画速度値には、それ自身を表示するのにかかった時間は加味されていません。画面に表示される描画速度値は、あくまで参考数値となります。
OpenGL ES には、標準では、文字列描画に関する関数、クラスは用意されていないので、自作します。
OpenGL ES での文字列描画のひとつの方法は以下です。
- ビットマップオブジェクトを生成する。
- 作成したビットマップを描画対象とするキャンバスオブジェクトを生成する。
- 生成したキャンパス上に文字列を描画すると、文字列が描画されたビットマップオブジェクトができる。
- 文字列が描画されたビットマップをテクスチャとして、OpenGL描画すると、画面に文字列が表示されます。
実装
プロジェクトを開く
06.で作成したモデルビューアプロジェクトを開きます。
モデルビューアレンダラクラスにシーン描画関数をオーバーライド
モデルビューアレンダラクラスに、描画速度計算処理および描画速度表示処理を追加した、シーン描画関数を、オーバーライド関数として追加します。
メッセージ描画関数も追加します。
メッセージテクスチャオブジェクトを識別するテクスチャID変数をメンバー変数として追加します。
キャンバスに文字列を描画するときのペンオブジェクトをメンバー変数として追加します。
メッセージテクスチャのポリゴン座標用のFloatBuffer変数をメンバー変数として追加します。
メッセージテクスチャのテクスチャ座標値用のFloatBuffer変数をメンバー変数として追加します。
コンストラクタに、FloatBufferオブジェクト生成処理を追加します。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
メッセージ用テクスチャの構築関数、破棄関数の追加
モデルビューアレンダラクラスに、メッセージ用テクスチャオブジェクトを構築する関数、メッセージ用テクスチャオブジェクトを破棄する関数を追加します。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
OpengGL描画コンテキストの消失と再作成に対応する
OpenGL描画コンテキストの消失と再作成に対応します。
アクティビティの一時停止と復帰が行われたときに、OpenGL描画コンテキストの消失と再作成が行われます。
OpenGL描画コンテキストが消失すると、グラフィックスメモリ上のテクスチャは消失します。OpenGL描画コンテキストの再作成が行われても、グラフィックスメモリ上のテクスチャオブジェクトの再作成は、自動では行われません。
グラフィックスメモリ上にテクスチャオブジェクトはないにもかかわらず、グラフィックスメモリ上にテクスチャオブジェクトがあるものとして描画処理等を行うと、プログラムがクラッシュすることもあります。
OpenGL描画コンテキストが消失されようとするときには、テクスチャオブジェクトの破棄処理を実施するようにします。
モデルビューアビュークラスに、onPause関数をオーバラード関数として追加し、OpenGL描画コンテキストが消失しようとするときに実施すべき処理の窓口関数の呼び出しを追加します。
UIスレッドからのOpenGL関数呼び出しになるので、イベントキューイングします。
ベースOpenGLレンダラクラスに、OpenGL描画コンテキストが消失しようとするときに実施すべき処理の窓口関数を追加します。
モデルビューアレンダラクラスに、OpenGL描画コンテキストが消失しようとするときに実施すべき処理の窓口関数をオーバーライド関数として追加し、テクスチャオブジェクトの破棄関数の呼び出しを追加します。
OpenGL描画コンテキストが再作成されたときには、テクスチャオブジェクトの構築処理を実施するようにします。
モデルビューアレンダラクラスに、onSurfaceCreated関数をオーバーライド関数として追加し、テクスチャオブジェクトの構築関数の呼び出しを追加します。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。
実行
Android端末にて、動作確認。
実行し、アスキー形式STLファイルからモデルデータを読み込み、回転等の再描画が発生する操作を行なった際に、描画速度が画面下部ーに表示されることを確認します。
- fps
- frame per second : 1秒間に描画できる回数を表します。数値が大きいほど、描画速度は速いことになります。
- spf
- second per frame : 1回の描画に要する時間を表します。数値が小さいほど、描画速度は速いことになります。
ModelData01.stlファイルの読み込み
ダウンロード
サンプルプロジェクト
(github.com上のダウンロードページ)
関連ページ
前項目:06.モデルデータファイル読み込みを作る
次項目:08.描画の高速化(頂点バッファオブジェクトの利用)