2012年9月21日金曜日

ODE 0.12にアップデイト

いままで、ODE(Open Dynamics Engine)は、FreeBSDのPorts(devel/ode)のものを使ってました。このバージョンは 0.11.1です。いま、ODEプロジェクトのホームページを確認したら、0.12がでていました。0.11.1が出たのが 2009-10-17で、0.12が2012-05-28 ですので、いろいろとバグが修正されていることが期待できます。まだ、Portsは0.11.1のまんまなんで、ここは手動でソースコードからライブラリをインストールすることにします。

automakeをインストール

ODEのコンパイルには、automakeが必要ですので、Portsからインストールします。
# cd /usr/ports/devel/automake && make install clean
依存関係のあるPortsもあわせてインストールされますが、まあ、気にしない。
automakeはODEをコンパイルする為だけに必要で、実行時には必要ありません。

ソースコード取得とパッチあて

ODEのサイトの download のリンクをたどると、sourceforgeのサイトにいきます。そこから、「ode-0.12.tar.bz2」をダウンロードし、展開します。ダメなら、ブラウザ等でいったんダウンロードしてから、FreeBSDに転送します。
# fetch http://sourceforge.net/projects/opende/files/ODE/0.12/ode-0.12.tar.bz2
# tar xvzf ode-0.12.tar.bz2
...
... ファイルが展開される
...

展開したソースコードのMakefile.amに次のパッチを当てます。こちらからダウンロードするか、コピペして、「ode-0.12_freebsd.patch」というファイル名で保存してください。
--- Makefile.am.orig    2012-02-12 07:03:27.000000000 +0900
+++ Makefile.am 2012-09-19 21:24:49.000000000 +0900
@@ -40,5 +40,5 @@
         CHANGELOG.txt INSTALL.txt README.txt LICENSE.TXT \
         bindings

-pkgconfigdir = $(libdir)/pkgconfig
+pkgconfigdir = $(libdir)data/pkgconfig
 pkgconfig_DATA = ode.pc
このパッチを当てないと、monoがlibode.soを見つけられなくてエラーになります。odeのソースコードがFreeBSDの devel/pkgconf の仕様に適合してない為みたいです。

# cd ode-0.12
# patch -p1 < /some/where/ode-0.12_freebsd.patch

configure & make

パッチがあたったら、sh autogen.shを実行して、configureスクリプトを作成します。
# sh autogen.sh
次にconfigureスクリプトに、次の引数をつけて実行します。
# ./configure --disable-asserts --enable-shared --disable-demos --with-drawstuff=none CFLAGS="-O2 -msse -march=i686" CXXFLAGS="-O2 -msse -march=i686"
CFLAGSとCXXFLAGSに「-O2 -msse -march=i686」をつけているのは、IntelCPUのSSE命令などをつかって、ちょっとでも最適化し、性能を上げようとしてます。サーバーのCPUのアーキテクチャにあわせて、適切なものに変えるといいかもしれません(どのくらいパフォーマンスが稼げるのかは不明)。

では、ソースコードをmakeし、エラーがなければインストールします。
# make
...
... 
# make install
...
...
インストールが完了したら、OpenSim.exeを再起動します。エラーなく起動されればOK。

動作確認

さて、うまくうごいているか動作を確認してみます。
まずは、CUBE を500個だし、物理属性をつけます。


 だんだん崩れていきます。


 ぺっちゃんこになりました。


さすがに、500個も物理オブジェクトを出すと、身動きがとれません。ちなみにOpenSimを動かしているコンピュータは、Intel ATOM D525、メモリ4GBです。


 CUBEの中を歩き回ります。まともに動けませんけど、OpenSimは落ちないみたいです。


この時の、topコマンドによるプログラムの状態は、次の通りです。
last pid: 86961;  load averages:  1.13,  0.77,  0.48                                           up 5+10:20:55  01:07:55
93 processes:  2 running, 88 sleeping, 3 stopped
CPU: 25.5% user,  0.0% nice,  2.3% system,  0.0% interrupt, 72.1% idle
Mem: 503M Active, 2020M Inact, 224M Wired, 61M Cache, 112M Buf, 188M Free
Swap: 2048M Total, 2528K Used, 2045M Free

  PID USERNAME  THR PRI NICE   SIZE    RES STATE   C   TIME   WCPU COMMAND
86679 opensim    53  44    0   413M   322M ucond   3  10:17 104.98% mono
 1673 mysql      16  50    0   192M 45656K sigwai  2   7:24  0.00% mysqld
 2242 opensim     1  44    0 11900K  8732K select  0   0:54  0.00% screen
68091 opensim     1  44    0  3688K  1688K CPU2    1   0:04  0.00% top
 1685 root        1  44    0  3384K  1120K nanslp  1   0:04  0.00% cron
 1460 root        1  44    0  3352K  1096K select  1   0:03  0.00% syslogd
.....
.....
.....
重いのは重いけど、sshで接続しているセッションは普通に操作できます。
また、私のリージョンサーバーは、現在4つのリージョンがあるのですが、CUBEをぶちまけた隣のリージョンにテレポートしたら、そこでは普通にうごけました。

また、500個も物理オブジェクトをぶちまけると、次のような警告がOpenSimのコンソールに沢山でます。
01:04:41 - [PHYSICS]: Physical Object went out of bounds.
01:04:41 - [PHYSICS]: Physical Object went out of bounds.
...
... 途中省略 ...
...
01:05:01 - [PHYSICS]: Physical Object went out of bounds.
01:05:03 - [PHYSICS]: Physical Object went out of bounds.
01:05:03 - [PHYSICS]: Physical Object went out of bounds.
Region (root) #

これらのオブジェクトは、地面の下にもぐっていたり、リージョン境界でぐるぐるまわってたり、隣のリージョンまでいってしまってたりします。ビュアーのArea Search等で、オブジェクトを探して、一つ一つ削除していかないといけなくなります(>_<)。作業を簡単にするため、あらかじめ物理オブジェクトには、検索しやすいような名前をつけておくことをお勧めします。

まとめ


まだ、もっと様子をみないといけないけど、ODEがいきなり落ちてしまうということはなくなったかもしれません。

0 件のコメント:

コメントを投稿