「点群表示機能を自作してみる」のその3です。
100万点を表示するところまでやります。GPU力押し(というほどでもない普通のコード)です。現在のハードでどこまで可能そうなのかを見積もります。
出来上がり図
GitHub 以下のリビジョンを参照してください。
Revision: a735360988386ab09e39e5643b69be274f8888c5
Message:
added dense point cloud model.
modified to show duration time to draw view.
説明
高々100万点は余裕でGPUにのるサイズですので、初期化時にバーテックスバッファを作り描画させます。 それでもパフォーマンス的にはぎりぎりのようでした。
技術的には前回からの差異はありません。
描画パフォーマンス
1フレームごとの描画時間を画面に表示できるようにし、適当に操作して描画時間を観察するという程度の確認です。
今後のためにバーテックスバッファを可変にした場合も比べてみます。
点数 | 点サイズ | 頂点バッファ | 描画時間[ms/frame] |
---|---|---|---|
100万点 | 0.001 | 固定 | 40~60 |
100万点 | 0.001 | 可変 | 40~60 |
100万点 | 0.1 | 固定 | 70~100 |
100万点 | 0.1 | 可変 | 70~100 |
1000万点 | 0.001 | 固定 | 150~220 |
どうも負荷の高い処理は、出力バッファのマージ的な処理のようです。
- 点のサイズを大きくすると遅くなる様子。
- 点が全て画面の外に出ると 0ms で描画される。(GetTickCount() を使っているので 15ms 以下と解釈できる。)
バーテックスバッファの固定・可変は D3D11_BUFFER_DESC hBufferDesc
を以下のように変更します。
hBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
hBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
hBufferDesc.Usage = D3D11_USAGE_DEFAULT;
hBufferDesc.CPUAccessFlags = 0;
但しこの設定により速度的な違いは生じませんね。そういうものか。
PointListSampleModel::OnCreateBuffer()
の nZ を10にすると1000万点になります。(以下のようなモデルになります。100万点の板10枚。)
速度的には20fps程度あるとまあまあレスポンスが良い感じがする。 10fps だとやや苦しい。 ということで以後1フレームで描画できる点数の目安として100万点と考えることにします。 (10億点の1000分の1。)