トップページ > 記事閲覧
連続した線分の描画の高速化について
名前:ゆーすけ 日時: 2015/01/12 20:40

あけましておめでとうございます。 今年もお世話になります。 今回は線分の描画に関して質問があります。 複数の頂点をDrawLine3D(または3DD)で順番に結んで描画処理を行わせようとして オーソドックスに頂点をVECTOR_D型変数の配列に順次格納してForループ中で i番目とi+1番目の頂点をDrawLine3Dで結ぶというやり方をとっているのですが、 これが結構負荷がかかるようで処理を行わせると体感で分かるくらい重くなります。 このような状況で何とか負荷を軽減する方法はないものでしょうか? よい方法をご存知でしたらご教示いただきたいと思います。 お忙しいとは思いますがどうぞよろしくお願いします。
メンテ

Page: 1 |

Re: 連続した線分の描画の高速化について ( No.1 )
名前:管理人 日時:2015/01/13 01:27

double型版でなければ DrawPrimitive3D という関数で一度に線分を沢山描画することができるのですが、 double型版は一本一本描画することで精度を高めているので、double型版の DrawPrimitive3D を作成しても 精度が足りないかもしれませんね・・・ 一本一本の線分の距離はどのくらいでしょうか?
メンテ
Re: 連続した線分の描画の高速化について ( No.2 )
名前:ゆーすけ 日時:2015/01/13 05:57

管理人様 ありがとうございます。 やはり一度に線分を描画する関数があるのですね。 線分の距離は長い時でおそらく数万程度ですが、現在でもこの線分の描画については 大部分をfloat版で行っていますのでfloat版でもそのような関数があれば大丈夫だと思います。 ただ非公開関数のようで、DxLib.h中に定義されている関数の書式を見ても 使い方がよくわかりません(汗 よろしければDrawPrimitive3D関数で一度に線分を描画する処理の流れを 教えていただけないでしょうか?
メンテ
Re: 連続した線分の描画の高速化について ( No.3 )
名前:ゆーすけ 日時:2015/01/13 06:39

すみません、先ほどリファレンスのDrawPolygon3D関数の項目を参考にして見よう見真似でやってみたら とりあえず線は引けたようです。 ただしDrawPrimitive3Dで引いた部分の線は切れ切れの点線のような状態になってしまっています。 切れ目のない実線として線を引きたいので問題点等あればご教示お願いします。 コードはこのような感じです。 Dim VtxGroup(VtxNum) As DX.VERTEX3D'頂点データの集合用 'PosData(VtxNum):元々の頂点データ(VECTOR_D型) 'VtxNum:頂点数 For i=1 To VtxNum VtxGroup(i).pos=DX.VConvDtoF(PosData(i)) VtxGroup(i).norm=DX.VGet(1,0,0) VtxGroup(i).diff=DX.GetColorU8(255,255,0,255) Next DX.DrawPrimitive3D(VtxGroup(1),VtxNum,DX.DX_PRIMTYPE_LINELIST, DX.DX_NONE_GRAPH, DX.FALSE) ↑これで順番に連結した黄色い実線が引けることを期待しているのですが・・・ VBなのでDrawPrimitive3D関数にポインタで渡す部分が微妙ですが、とりあえず軌跡そのものは きちんと引けているようです。 問題点等あればご指摘のほどよろしくお願いします。
メンテ
Re: 連続した線分の描画の高速化について ( No.4 )
名前:管理人 日時:2015/01/14 00:52

すみません、今晩中に DrawPrimitive3D の double 版を作成するのは作業時間が確保できなくて無理そうです・・・ > 問題点等あればご指摘のほどよろしくお願いします。 恐らく DX.DX_PRIMTYPE_LINELIST を DX.DX_PRIMTYPE_LINESTRIP にすれば点線ではなくなると思います DX_PRIMTYPE_LINELIST は2頂点で一つの線分を表すので、 DX_PRIMTYPE_LINELIST で一つの繋がった 線を表現する場合は頂点データの座標を 配列番号[0] 頂点0の座標 配列番号[1] 頂点1の座標 配列番号[2] 頂点1の座標 配列番号[3] 頂点2の座標 配列番号[4] 頂点2の座標 配列番号[5] 頂点3の座標 のようにする必要があります、対して DX_PRIMTYPE_LINESTRIP は一つの繋がった線を表現するためのタイプなので、 一つの繋がった線を表現する場合の頂点データの座標はそのまま 配列番号[0] 頂点0の座標 配列番号[1] 頂点1の座標 配列番号[2] 頂点2の座標 配列番号[3] 頂点3の座標 配列番号[4] 頂点4の座標 配列番号[5] 頂点5の座標 とすることができます よろしければお試しください
メンテ
Re: 連続した線分の描画の高速化について ( No.5 )
名前:ゆーすけ 日時:2015/01/14 06:21

プリミティブのタイプにはそんな意味があったんですね(汗 LINESTRIPで指定したところきちんと実線で描画されるようになりました。 負荷についてもForループでDrawLine3Dを繰り返していたのと比べて かなり下がり、非力なノートPCで実行した際の描画時のフレームレートや 物理計算のパフォーマンスも大きく改善されました。 どうもありがとうございました。
メンテ
Re: 連続した線分の描画の高速化について ( No.6 )
名前:管理人 日時:2015/01/15 02:46

すみません、本日も作業ができませんでした もしかしたら週末までできないかもしれません・・・ > LINESTRIPで指定したところきちんと実線で描画されるようになりました。 件の精度についても問題ないのでしょうか?
メンテ
Re: 連続した線分の描画の高速化について ( No.7 )
名前:ゆーすけ 日時:2015/01/15 21:17

精度については問題ありません。 元々注視点を末端の頂点に置くことがあり、カメラを至近距離に近づけることがあったので 末端とその隣の頂点を結ぶ線分に関してはdouble版の精度が必要だったのですが、 その他の頂点については基本的に近くにカメラが寄ることがほとんどないので float版の使用により多少ずれが出ても見た目では分からないという感じです。 たまたまカメラがどれかの頂点の至近距離(100メートル以内とか)に来ると ずれが分かりますが、線分が存在する空間は広ければ数千キロ以上のスケールで 頂点の間隔も数十キロはありますので、そのような状況になるのは 狙っても相当難しく実用上は問題ない精度だと思っています。 重ねてご教示ありがとうございました。
メンテ
Re: 連続した線分の描画の高速化について ( No.8 )
名前:管理人 日時:2015/01/16 00:33

ご返答ありがとうございます DrawPrimitive3D の高精度対応をすると( DrawLine3D を何度も呼ぶよりは軽いですが )やはりそれなりに 重くなってしまうので、現時点で float版で精度に問題が無いということでしたら、暫く保留にしたいと思います もし精度が必要になりましたら対応しますので、その際は教えてください
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存