Samples

MascotCapsule BREW テンプレートについて

本ドキュメントでは BREW for KDDI – MascotCapsule のサンプルで使用している、プログラムテンプレートの処理の流れについて説明します。
BREW サンプルのプログラムテンプレートとして MascotCapsule のバージョンごとに、以下のファイルが格納されています。

  • ・MascotCapusle V3 / V4 ( V3 互換 ) / V4 には    brewmain.c
  • ・MascotCapsule eruption には    EruptionBase.c

MascotCapsule の各サンプルにおいて、バージョンによる差異はありますが、上記ファイルは基本的にプログラムテンプレートとして同様の処理を行っています。

目次


1. 処理の流れ

BREW 上でアプレットの起動が行われた際、テンプレートは以下の流れで処理を行います。

  1. AEEClsCreateInstance() にてアプレットインスタンスを生成
  2. 【 イベントハンドラ部 ( SystemHandleEvent 関数 ) 】
    AEE から渡されるアプレット起動のイベント EVT_APP_START をイベントハンドラが取得する
  3. 【 初期化処理部 ( SystemInit 関数 ) 】
    イベントハンドラより、初期化処理の SystemInit() が呼ばれ、MascotCapsule のインスタンス生成による初期化、OpenGL ES の初期化、3D データの読み込み等を行う
  4. 【 描画更新部 ( SystemFrame 関数 ) 】
    初期化が成功すると、メインループを行う SystemFrame() が呼ばれ、アプリケーションの描画処理を行い、コールバック処理により描画更新処理を再帰呼び出しすることで、メインループが起動する
  5. 【 終了処理部 ( SystemFin 関数 ) 】
    アプレットの参照カウントが 0 になった時点で、3D データや MascotCapsule の終了解放処理を行い、アプレットを終了させる



2. バージョンごとの差分

MascotCapsule V3 / V4 ( V3 互換 ) / V4 / eruption それぞれのテンプレートでは、初期化や終了処理において、上図の処理の他に以下のような処理が追加されており、バージョンによってテンプレートの内容に違いがあります。

V3 V4 ( V3 互換 ) V4 eruption
初期化処理 DIB(フレームバッファ) 取得
Allocator 実装
FileIStream 実装
OpenGL ES 初期化
Allocator 実装
FileIStream 実装
OpenGL ES 初期化 OpenGL ES 初期化
終了処理 Allocator 終了処理
DIB 解放
Allocator 終了処理
OpenGL ES 終了処理
OpenGL ES 終了処理 OpenGL ES 終了処理

MascotCapsule V3 / V4 ( V3 互換 ) で行われている Allocator と FileIStream の実装についてはサンプル集「メモリアロケータとインプットストリーム」をご参照ください。


3. 注意事項

3.1. MascotCapsule の初期化について

初期化処理部では、MascotCapsule のインスタンスを生成し、MascotCapsule を初期化しています。ISHELL_CreateInstance() を用い、MascotCapsule のクラスID を記述することで、インスタンスを生成します。
MascotCapsule のクラス ID は、MIF Editor にてアプリケーションの BID ファイルを作成する際に、 下図のように MascotCapsule Extension の include ディレクトリに含まれる BID ファイルを外部クラスとして追加することで使用することができます。

//*------ MascotCapsuleインスタンスの生成 ------*/

    work->pIMC = NULL;
    i_ret   = ISHELL_CreateInstance (work->Applet.m_pIShell,
                                     AEECLSID_ERUPTION_A31,
                                     (void **)&work->pIMC);


また、MascotCapsule V4( V3 互換 ) / V4 / eruption では OpenGL ES を用いており、BREW SDK に OpenGL ES Extension をインストールすることで、使用することができます。初期化処理部では、各バージョンに合わせた API にて OpenGL ES の初期化を行います。


3.2. 描画更新のループ処理について

メインループ部では、アプリケーションの更新処理と実スクリーンへの描画、コールバックによる再帰呼び出し処理を行っています。
再帰呼び出し処理として、通常では割り込みイベント処理に対し、最適化を図るために ISHELL_Resume() によって、メインループの再帰処理を行っていますが、端末によってISHELL_Resume() に対応していないものがあります。そのため ISHELL_SetTimerEx() を使った、一定時間ごとの再帰呼び出し処理によって割り込みイベント処理を実行できるループ処理も記述されています。ヘッダ部にて定義されている USE_SETTIMERを用いて、プリプロセッサによってISHELL_Resume() と ISHELL_SetTimerEx() を切り替えることが可能です。

/*------ メインルーチンの再帰呼び出し ------*/

    CALLBACK_Init (&work->Callback, (PFNNOTIFY)SystemFrame, work);

#ifdef USE_SETTIMER
       ISHELL_SetTimerEx (work->Applet.m_pIShell,FRAME_TIME,
	                                         &work->Callback);
#else /* USE_SETTIMER */
       ISHELL_Resume (work->Applet.m_pIShell, &work->Callback);
#endif /* USE_SETTIMER */

ISHELL_Resume() は、他のイベント処理と協調し、マルチタスクを実現できるため、他のイベントを邪魔することなく、メインループ処理を実行できます。よって対応している端末では ISHELL_Resume() でのコールバック処理を行うようにしてください。
下図は ISHELL_Resume() と ISHELL_SetTimerEx() の処理を概念的に表した比較図です。ISHELL_Resume() が安定した動作をしていることがわかります。

ISHELL_Resume() 使用時 ISHELL_SetTimerEx() 使用時


3.3. アニメーションスローダウン現象について

SystemHandleEvent() 内に記述されている、アニメーションスローダウン現象とは、BREW シミュレータにおいてスリープモードが起動すると、ISHELL_SetTimerEx() で設定したタイマが遅れ、メインループが極端に遅くなる現象です。
そのため、シミュレータでの起動時にはスリープモードに入らない設定になっています。
また、AEE_SIMULATOR マクロは VC プロジェクト内プリプロセッサにて定義されています。