9.描画の高速化(ディスプレイリストの利用)
8.で作成したモデルビューワの通常描画処理は、再描画のたびに、すべての描画要素に対してOpenGLの処理を呼び出していました。
ディスプレイリストを使用した描画高速化を行います。
(ディスプレイリストを使用すると、一連のOpenGLのコマンドの呼び出しをひとまとめにしてメモリ上に蓄えます。再描画の際にはメモリ上に蓄えた一連のOpenGLのコマンドの呼び出しをひとまとめで処理します。一連のOpenGLのコマンドの呼び出しを順次処理する場合に比べて、短時間で処理が行われます。)
実行形式ファイルダウンロード (ModelViewer6_exe.lzh)
ソースファイルダウンロード (ModelViewer6_src.lzh)
プロジェクトを開く
8.で作成したモデルビューワプロジェクトを開きます。
ディスプレイリスト用のメンバ変数の宣言の追加
ModelViewerView.h の CModelViewerViewクラスに
ディスプレイリスト用の3つのメンバ変数の宣言
unsigned int m_uiDisplayListIndex_Point;
unsigned int m_uiDisplayListIndex_Line;
unsigned int m_uiDisplayListIndex_Face;
とディスプレイリスト削除処理メンバ関数の宣言
void DeleteDisplayList();
を追加します。
ビルドし、エラー、警告がないことを確認します。
ディスプレイリスト用のメンバ変数の初期化処理の追加
ModelViewerView.cpp の CModelViewerViewクラスのコンストラクタにディスプレイリスト用の3つのメンバ変数の初期化処理を追加します。
ModelViewerView.cpp の CModelViewerView::CModelViewerView() の内容を以下のようにします。
ビルドし、エラー、警告がないことを確認します。
ディスプレイリスト削除処理メンバ関数の定義の追加
ModelViewerView.cpp にディスプレイリスト削除処理メンバ関数の定義を追加します。
ビルドし、エラー、警告がないことを確認します。
ディスプレイリスト削除処理メンバ関数の呼び出し処理の追加
モデルデータファイルを読み込んだ時には、ディスプレイリストを一旦削除します。
ModelViewerView.cpp のvoid CModelViewerView::OnFileOpen() の内容を以下のようにします。
(m_model = model; の後に、DeleteDisplayList();
を追加します。)
ビルドし、エラー、警告がないことを確認します。
通常描画処理をディスプレイリストを利用した処理に変更
ディスプレイリストを使用すると、一連のOpenGLのコマンドの呼び出しをひとまとめにしてメモリ上に蓄えます。再描画の際にはメモリ上に蓄えた一連のOpenGLのコマンドの呼び出しをひとまとめで処理します。一連のOpenGLのコマンドの呼び出しを順次処理する場合に比べて、短時間で処理が行われます。
ModelViewerView.cpp の CModelViewerView::RenderObjects() の内容を以下のようにします。
ビルドし、エラー、警告がないことを確認します。
実行
実行し、8.で作成したモデルビューワと、描画速度を比較します。
描画速度はステータスバーに表示されます。
- fps
- frame per second : 1秒間に描画できる回数を表します。数値が大きいほど、描画速度は速いことになります。
- spf
- second per frame : 1回の描画に要する時間を表します。数値が小さいほど、描画速度は速いことになります。
実行結果
8.で作成したモデルビューワの描画速度:143[fps]前後(数値はPCの性能に依存します)
9.で作成したモデルビューワの描画速度:333[fps]前後(数値はPCの性能に依存します)