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



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

プロジェクトを開く

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

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

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 にディスプレイリスト削除処理メンバ関数の定義を追加します。



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

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

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

ModelViewer.cpp の CModelViewerView::OnFileOpen関数の
m_model = model;
の後に、
DeleteDisplayList();
を追加します。



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

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

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



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

実行

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

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

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

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


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

ダウンロード

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

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