2018-03-27

Houdini Engine DLL Conflict

例えば、Maya 2016 で Houdini Engine プラグインをロードした際に libray.dll が以下の2箇所に存在し、それぞれが同じ名前でも別々のライブラリであることにより、衝突を起こす可能性がある。

  • C:\Program Files\Side Effects Software\Houdini 16.5.410\bin\libRAY.dll
  • C:\Program Files\Autodesk\mentalrayForMaya2016\bin\libray.dll

Houdini Engine for Maya プラグインは、デフォルトでは、Maya のインプロセスプラグインとして、動作するようになっている。一つのプロセス上に複数の同名のDLLがあれば問題が起こる。ここでは回避方法を

  1. インプロセスからネットワーク接続形式に変更する
  2. コンフリクトの起こる DLL をロードから除外する
の 2通り紹介する。




使用したビルド: 16.5.410
Maya 2016

1. インプロセスからネットワーク接続形式に変更する

Houdini Engine プラグインをロード後、Maya のメインメニュー の Houdini Engine -> Preferences… を開き、Back End 以下でデフォルトでは "Within Maya Process" なっているところをそれ以外に変更し、Maya を再起動。

  • 例えば、Named Pipe に変更し再起動すれば、Maya 内のプラグインと バックエンドのHoudini は別プロセスとなる。他 (TCP Socket や Manual Server) でも同様だが、それぞれ追加設定が必要。Named Pipe を使うのが設定不要なので一番簡単。
  • TCPソケットを使った場合、指定したホストでは HARS コマンドを走らせておく必要がある。
    $ HARS.exe -h
    Allowed options:
      -h [ --help ]             Produce this help message
      -s [ --socket-port ] arg  The server port, if using a TCP socket session
      -n [ --named-pipe ] arg   The name of the pipe, if using a named pipe session
      -a [ --auto-close ]       Close the server automatically when all client
                                connections are closed
      -r [ --ready-handle ] arg Event to signal when the server is ready to serve
                                (for automated server startup)
    • HARS は libHAPI とHoudini のコアのライブラリにダイレクトにリンクされており、使用している Thrift IPC がクロスプラットフォームであるため、サーバプロセスは別プラットフォームで稼動していても良い。ポートまたはパイプは、Maya内の Houdini Engine プレファレンスで指定したものと同じものを指定する必要がある。
    • 現時点では、HARS サーバは、単一のクライアントからの接続のみを許容する。あるクライアントからの接続が既に設立されている場合、別クライアントからの接続要求は、既存の接続が閉じるまでブロックされる。

プラグインが既に自動ロードになっていて、これを解除したい場合、以下の二つの方法のいずれかで自動ロードを無効に出来る。Maya 起動前に、テキストエディタで、Maya のプレファレンスディレクトリ (~/Documents/maya/2016/prefs/) 以下にある

  1. pluginPrefs.mel を開き、
    evalDeferred("autoLoadPlugin(\"\", \"houdiniEngine\", \"houdiniEngine\")");
    
    の行を削除する。
  2. userPrefs.mel を開き、 -iv "houdiniEngineSessionType" 0 となっているところを -iv "houdiniEngineSessionType" 2 と変更する。

1 の方法では、プラグインの自動ロードが解除になり、2の方法では、Houdini Engine がIn-process から Named pipe (ネットワーク接続) に変更される。

2. Module ファイルの書き換え

Maya のプラグインのロードに関する定義はモジュールファイルによって定義されている。これを書き換えることにより、コンフリクトの起こるライブラリをロードしないようにすることが出来る。

モジュールファイルは、Maya 2016 の場合、C:\Program Files\Autodesk\Maya2016\modules 以下にある houdiniEngine-maya2016 module のこと。これもテキストエディタで編集可能。

このファイルを開き、以下のように書き換える

+ MAYAVERSION:2016 houdiniEngine 1.0 maya2016
PATH +:= ../../../bin
HOUDINI_DSO_EXCLUDE_PATTERN={ROP_OpenGL,CHOP_Mouse3D,COP2_GPULighting,COP2_GPUFog,
COP2_GPUEnvironment,COP2_GPUZComposite,COP2_EnableGPU,SHOP_OGL,SOP_VDBUI,OBJ_ReLight,
RAY_ProcEngine,VEX_OpRender}*
上記の記述により、libray.dll をロードしようとしている RAY_ProcEngine(.dll) を除外している。どうやって libray.dll が RAY_ProcEngine.dll から呼ばれているかを知りえるのは簡単ではないが、Linux または Cygwin を使って、ldd コマンドを使うことで、ある DLL がどの他の DLL をコールしているかを調べることが出来る。
$ ldd RAY_ProcEngine.dll
        ntdll.dll => /windows/SYSTEM32/ntdll.dll (0x76fb0000)
        kernel32.dll => /windows/system32/kernel32.dll (0x76e90000)
        KERNELBASE.dll => /windows/system32/KERNELBASE.dll (0x7fefcdb0000)
        libRAY.dll => /PROGRA~1/SIDEEF~1/HOUDIN~1.410/bin/libRAY.dll (0x7fed2630000)
        ... さらに100行ぐらい続く

libray.dll からどの DLL がこれを参照しているかを調べるすべはない。dso ディレクトリとその子ディレクトリで、

$ ldd * | grep libRAY
などとして、libray.dll を参照しているDLLを判別することは可能。大文字、小文字も区別も考慮に入れる必要があり、一筋縄では行かないが、これで、インプロセス、ネットワークに関わらず、固有のライブラリの衝突を防ぐことが可能。

関連情報

0 件のコメント:

コメントを投稿