2012年10月15日月曜日

ODE 0.12をGIMPACTで再コンパイル

先月、「ODE 0.12にアップデイト」というBlogエントリを書いたのですが、OpenSim ODEで検索してたら、次のような記事を見つけました。これは、opensim-devのメーリングリスト(ML)に投稿されたもののアーカイブのようです。
Prospective ODE physics changes (将来のODE物理に関する変更)
http://opensim-dev.2196679.n2.nabble.com/Prospective-ODE-physics-changes-td7144808.html
このMLのスレッドは、18個ほど投稿がされています(Threadedのリンクをクリックするとスレッド一覧が見れます)。

議論の中身はあんまり理解できない(^_^;)のですが、collider(コライダー? 衝突検出器?)に従来のOPCODEではなく、GIMPACTを使ったほうがクラッシュしにくいとか、[ODEPhysicsSettings]の中の contacts_per_collision というパラメータを80からもっと小さい値にしてもいいんじゃないか、とかが議論されています。まあ、詳しくは、上記MLのスレッドをご覧ください。

ODE 0.12の再構築

前回のODE 0.12のコンパイルでは、「http://opensimulator.org/wiki/PhysicsEngines」の内容に従って、configureのオプションを決めたのですが、今回は「--with-trimesh=gimpact」のオプションをつけることにします。

まずは、前回の 「ODE 0.12にアップデイト」の手順に従い、ソースコードを取得し、FreeBSD用パッチをあてます。その後、「sh autogen.sh」でconfiguareスクリプトを作成して、次の引数をつけてconfigureを実行します。
# ./configure --disable-asserts --enable-shared --disable-demos --with-drawstuff=none --with-trimesh=gimpact CFLAGS="-O2 -msse -mar
ch=i686" CXXFLAGS="-O2 -msse -march=i686"
ちょっと見ずらいので、複数行で表記すると次のようになります(UNIXのShellは行末に「\」がある場合、次の行と連結して1つの行として扱います)。
# ./configure --disable-asserts --enable-shared --disable-demos \
              --with-drawstuff=none --with-trimesh=gimpact \
              CFLAGS="-O2 -msse -march=i686" \
              CXXFLAGS="-O2 -msse -march=i686"
後は、make & install します。
# make
...
... 
# make install
...
...
この新しいODEのライブラリだと、クラッシュしにくくなったような気がします。

contacts_per_collision パラメーターの調整

OpenSim.iniの [ODEPhysicsSettings] セクションに contacts_per_collisionのパラメータを追加します(ODEに関するパラメータの大部分は、OpenSimDefaults.ini にあります。OpenSim.iniはそれに追加・上書きしています)。
[ODEPhysicsSettings]
    contacts_per_collision = 10
このcontacts_per_collisionの値を小さくすると、物理オブジェクトを使ったときのCPUの負荷が劇的に減ります。10 の値が妥当なのかどうかは判りませんし、なんか乗物等で不都合がでるかもしれません。でも、物理な0.5m角のCUBEを400個くらい積み上げて崩してみても、前よりはアバターが動けるように感じますし、崩れ方・転がり方も、以前よりすこし自然な感じがします。
それと、いまのところクラッシュしていません。まあ、私の主目的は、クラッシュしないことですんで、これでとりあえず良しとします。

物理オブジェクトの掃除のTips

物理オブジェクト を積み上げて崩すという遊びをしていると、コンソールに「 [PHYSICS]: Physical Object went out of bounds.」という警告メッセージがどんどんでたり、あっちこっちに散らばった物理オブジェクトを探し回って消さなくてはいけなくなることがあります。
こんな場合、OpenSimの次のようなコンソールコマンドを使うと便利です。
delete object outside - Delete all scene objects outside region boundaries
delete object name [--regex]  - Delete a scene object by name.
show object name [--regex]  - Show details of scene objects with the given name.

範囲外にでたオブジェクトは、「delete object outside」コマンドで削除します。
物理オブジェクトに、あらかじめ特徴的な名前をつけておいて、「delete object name --regex オブジェクト名の正規表現」とすれば、探し回わって消さなくてもすみます。間違って他のオブジェクトを消してしまわないように、あらかじめ、「show object name --regex ...」で消すオブジェクトを確認しといたほうがいいかもしれません。


a

2012年10月10日水曜日

メモリリークの原因

OpenSim Version 0.7.5 (Dev)Build 4e9509d にアップデイトしてみましたが、相変わらずメモリ使用量は時間とともに増加するようです。
Kimiko Dover さんの「OSgridのメモリー消費増加の原因」って記事を前にみてたので、試しに OpenSim.iniの[Startup]セクションの次の3つの設定をコメントアウトにしてみました。
[Startup]
    ...
    ;WorldMapModule = "WorldMap"
    ;MapImageModule = "Warp3DImageModule"
    ;GenerateMaptiles = true
コメントアウトし、しばらく動かしてみてますが、メモリ使用量の増加はおこらないようです。psコマンドを定期的に動かしてメモリ使用量を記録するスクリプトをcronで動かしてみてますが、増えたり減ったりしてます(減ることもある)。
vsizeが仮想記憶メモリサイズ(KB)で、rssが常駐メモリサイズ(KB)です。
タイムスタンプ       vsize  rss    コマンドライン
2012-10-09 23:00:00  316780 224232 mono OpenSim.exe
2012-10-09 23:30:00  316780 224232 mono OpenSim.exe
2012-10-10 00:00:00  316780 224232 mono OpenSim.exe
2012-10-10 00:30:00  316780 224232 mono OpenSim.exe
2012-10-10 01:00:00  316780 224256 mono OpenSim.exe
2012-10-10 01:30:00  316848 224304 mono OpenSim.exe
2012-10-10 02:00:00  316848 224332 mono OpenSim.exe
2012-10-10 02:30:00  316848 224340 mono OpenSim.exe
2012-10-10 03:00:00  316848 226112 mono OpenSim.exe
2012-10-10 03:30:01  316848 214680 mono OpenSim.exe
2012-10-10 04:00:00  316848 213312 mono OpenSim.exe
2012-10-10 04:30:00  316848 210284 mono OpenSim.exe
2012-10-10 05:00:01  316848 210284 mono OpenSim.exe
2012-10-10 05:30:00  316848 210296 mono OpenSim.exe
2012-10-10 06:00:00  316848 208484 mono OpenSim.exe
2012-10-10 06:30:00  316848 208484 mono OpenSim.exe
2012-10-10 07:00:00  316848 209968 mono OpenSim.exe
2012-10-10 07:30:00  316848 209968 mono OpenSim.exe
2012-10-10 08:00:00  316848 209968 mono OpenSim.exe
2012-10-10 08:30:00  316848 209968 mono OpenSim.exe
2012-10-10 09:00:00  316848 209972 mono OpenSim.exe
2012-10-10 09:30:00  316848 209972 mono OpenSim.exe
2012-10-10 10:00:00  316848 209972 mono OpenSim.exe
2012-10-10 10:30:00  316848 209972 mono OpenSim.exe
2012-10-10 11:00:00  316848 212752 mono OpenSim.exe
2012-10-10 11:30:00  316848 212756 mono OpenSim.exe
2012-10-10 12:00:00  316848 212756 mono OpenSim.exe
2012-10-10 12:30:00  316848 212756 mono OpenSim.exe
2012-10-10 13:00:00  316848 212760 mono OpenSim.exe
2012-10-10 13:30:00  316848 212760 mono OpenSim.exe
2012-10-10 14:00:00  316848 212760 mono OpenSim.exe
2012-10-10 14:30:00  316848 212760 mono OpenSim.exe
2012-10-10 15:00:00  316848 213096 mono OpenSim.exe
2012-10-10 15:30:00  316848 213096 mono OpenSim.exe
2012-10-10 16:00:00  316848 213096 mono OpenSim.exe
Warp3DImageModuleについては、「http://opensimulator.org/wiki/Warp3DImageModule 」に記述があります。

Warp3DImageModuleを使わないと、マップに表示される画像がしょぼくなりますが、メモリリークしなくなります。なので、使わない方向でしばらく動かそうと思います。

ちなみにOSG48のメンバーの方によると、WindowsでOpenSimを動かしている場合は、このようなメモリリークは起こらないそうです。

Warp3DImageModule、もしくはmono特有の問題なのかもしれません。libgdiplusとかX11とかのライブラリとかが関係しているのかも...。

2012年10月7日日曜日

OpenSim Version 0.7.5 (Dev)Build 4e9509d にアップデイト

OSGridのOpenSimの新しいバージョンがリリースされていましたので、アップデイト掛けてみました。
OpenSim Version 0.7.5 (Dev)Build 4e9509d[r/20546]
 正常に起動されているようです。まあしばらく様子をみてみます。