ホーム > プログラミング > モデルビューワを作る > 09.描画の高速化(ディスプレイリストの利用)

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 にディスプレイリスト削除処理メンバ関数の定義を追加します。
ビルドし、エラー、警告がないことを確認します。

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

モデルデータファイルを読み込んだ時には、ディスプレイリストを一旦削除します。
ModelViewerView.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の性能に依存します)

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

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


コメント


ご意見、ご感想、ご質問、ご要望等は、「コメントを投稿する」もしくは「ホーム > コンタクト」よりお願いいたします。
内容の誤り、誤字脱字、リンクミスなどの問題点を発見された場合には「コメントを投稿する」もしくは「ホーム > コンタクト」より連絡していただけると幸いです。


Copyright (c) 2004-2007 Nobuki HIRAMINE All rights reserved.