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の性能に依存します)