8.描画の高速化(通常描画とピック描画の処理の分離)



5.で作成したモデルビューワの描画処理は、通常描画とピック描画を同一の処理で行っていました。
通常描画とピック描画とで処理を分けることにより通常描画の高速化を行います。

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

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

プロジェクトを開く

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

通常描画とピック描画とで処理を分ける

5.で作成したモデルビューワの描画処理は、通常描画とピック描画を同一の処理で行なっていました。
通常描画とピック描画とで処理を分けることにより通常描画の高速化を行います。

①glPushName()、glPopName
ピック描画の描画処理には、glPushName()、 glPopName()という描画に名前を付ける処理が必要ですが、これは通常描画の描画処理には必要ありません。
②glBegin()、glEnd()
ピック描画の描画処理は、ピックできるようにする要素の描画ごとに、glBegin()、glEnd()を呼び出して要素の描画ごとに異なる名前を付ける必要がありますが、通常描画の描画処理は、複数の要素の描画をまとめて、glBegin()、glEnd()を呼び出すことができます。そして一般的に、glBegin()、glEnd()の回数は少ない方が短時間で処理が行なわれます。
③ピック要素(ピックされている要素)の描画
ピック描画の描画処理には、ピック要素の描画処理は必要ありません。

①、②、③を元に、RenderObjects() を通常描画とピック描画とで別々の処理が行なわれるように変更します。

ModelViewerView.cpp の CModelViewerView::RenderObjects() の内容を以下のようにします。



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

実行

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

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

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

実行結果

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


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