RoboCup Simulator Dev

  Column   更新履歴
  第4回 「シミュレーションの高速化」
  1.  ODEは比較的高速に動作するような作りになっていますが、それでも処理落ちすることがあります。

        例えば、大量のオブジェクトを扱う場合。

     
        ds+のサンプルをいじるとこうなります。

  2.  表示の設定を変更してみましょう。
        影やテクスチャの表示をOFFにすると描画が速くなります。
        また、ウィンドウサイズを小さくすることでも描画スピードが上がります。

  3.  精度が求められていないのであれば、dWorldQuickStep関数を使ってみましょう。
        dWorldStep関数を使った時と比べて2~3倍は速くなると思います。

  3.  ロボットなど、複数のパーツで構成される物体はちゃんとジョイントで繋ぎましょう。
        可動部はヒンジやスライダ、ユニバーサルジョイント、それ以外は固定ジョイントを使います。

        衝突コールバック関数はこんな感じですね。

        void nearCallback(void *data, dGeomID o1, dGeomID o2)
        {
                dBodyID b1 = dGeomGetBody(o1);
                dBodyID b2 = dGeomGetBody(o2);

                if (b1 && b2 && dAreConnectedExcluding(b1, b2, dJointTypeContact)) return;

                const int N = 5;
                dContact contact[N];
                int n = dCollide(o1, o2, N, &contact[0].geom, sizeof(dContact));
                if (n > 0) {
                        for (int i = 0; i < n; i++) {
                                contact[i].surface.mode = dContactBounce | dContactApprox1 |
                                                                              dContactSoftERP | dContactSoftCFM;
                                contact[i].surface.mu = 3.0;
                                contact[i].surface.bounce = 0.5;
                                contact[i].surface.bounce_vel = 0.5;
                                contact[i].surface.soft_erp = 0.8;
                                contact[i].surface.soft_cfm = 1e-9;

                                dJointID c = dJointCreateContact(world, contactgroup, &contact[i]);
                                dJointAttach(c, b1, b2);
                        }
               }
        }

        ジョイントで繋がれたオブジェクトの衝突検出はスキップしましょう。

  4.  物体の衝突は極力減らした方が高速に動作します。
        スキマを開けるなど、オブジェクトの配置を工夫すると良いでしょう。

  5.  余計な常駐ソフトを止めてみましょう。
        多少は効果があるかもしれません。

  6.  デバッグなし(Ctrl+F5)で実行してみましょう。
        デバッガを通さずに実行するため高速化が期待されます。

一覧に戻る 前へ 次へ

Home | About | BBS | Column | Downloads | Links
©2010 Shinpuku @ Hibikino-Musashi