09.描画の高速化(ディスプレイリストの利用)



08.で作成したモデルビューワの通常描画処理は、再描画のたびに、すべての描画要素に対してOpenGLの処理を呼び出していました。
ディスプレイリストを使用した描画高速化を行います。
(ディスプレイリストを使用すると、一連のOpenGLのコマンドの呼び出しをひとまとめにしてメモリ上に蓄えます。再描画の際にはメモリ上に蓄えた一連のOpenGLのコマンドの呼び出しをひとまとめで処理します。一連のOpenGLのコマンドの呼び出しを順次処理する場合に比べて、短時間で処理が行われます。)

プロジェクトを開く

08.で作成したモデルビューワプロジェクトを開きます。

ディスプレイリスト用のメンバ変数の宣言の追加

ModelViewerRenderer.h の CModelViewerRendererクラスに
ディスプレイリスト用の3つのメンバ変数の宣言
unsigned int m_uiDisplayListIndex_Point;
unsigned int m_uiDisplayListIndex_Line;
unsigned int m_uiDisplayListIndex_Face;
とディスプレイリスト削除処理メンバ関数の宣言
void DeleteDisplayList();
を追加します。



ビルドし、エラー、警告がないことを確認します。

ディスプレイリスト用のメンバ変数の初期化処理の追加

ModelViewerRenderer.cpp の CModelViewerRendererクラスのコンストラクタにディスプレイリスト用の3つのメンバ変数の初期化処理を追加します。

ModelViewerRenderer.cpp の CModelViewerRenderer::CModelViewerRenderer関数 の内容を以下のようにします。



ビルドし、エラー、警告がないことを確認します。

ディスプレイリスト削除処理メンバ関数の定義の追加

ModelViewerRenderer.cpp の末尾にディスプレイリスト削除処理メンバ関数の定義を追加します。



ビルドし、エラー、警告がないことを確認します。

ディスプレイリスト削除処理メンバ関数の呼び出し処理の追加

モデルデータファイルを読み込んだ時には、ディスプレイリストを一旦削除します。

ModelViewerRenderer.cpp の WndProc関数 のID_FILE_OPENに対応する処理の
glrenderer.m_model = model;
の前に、
glrenderer.DeleteDisplayList();
を追加します。



ビルドし、エラー、警告がないことを確認します。

通常描画処理をディスプレイリストを利用した処理に変更

ディスプレイリストを使用すると、一連のOpenGLのコマンドの呼び出しをひとまとめにしてメモリ上に蓄えます。再描画の際にはメモリ上に蓄えた一連のOpenGLのコマンドの呼び出しをひとまとめで処理します。一連のOpenGLのコマンドの呼び出しを順次処理する場合に比べて、短時間で処理が行われます。

ModelViewerRenderer.cpp の CModelViewerRenderer::RenderObjects関数 の内容を以下のようにします。



ビルドし、エラー、警告がないことを確認します。

実行

実行し、08.で作成したモデルビューワと、描画速度を比較します。

描画速度はステータスバーに表示されます。

fps
frame per second : 1秒間に描画できる回数を表します。数値が大きいほど、描画速度は速いことになります。
spf
second per frame : 1回の描画に要する時間を表します。数値が小さいほど、描画速度は速いことになります。

09.で作成したモデルビューワの描画速度:50[fps]前後(数値はPCの性能に依存します)


08.で作成したモデルビューワの描画速度:33[fps]前後(数値はPCの性能に依存します)

ダウンロード

実行形式ファイルダウンロード (ModelViewerOpenGLWinAPI2008_09_exe.lzh)

ソースファイルダウンロード (ModelViewerOpenGLWinAPI2008_09_src.lzh)