例えば、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があれば問題が起こる。ここでは回避方法を
- インプロセスからネットワーク接続形式に変更する
- コンフリクトの起こる DLL をロードから除外する
使用したビルド: 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/) 以下にある
- pluginPrefs.mel を開き、
evalDeferred("autoLoadPlugin(\"\", \"houdiniEngine\", \"houdiniEngine\")");
の行を削除する。 - 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を判別することは可能。大文字、小文字も区別も考慮に入れる必要があり、一筋縄では行かないが、これで、インプロセス、ネットワークに関わらず、固有のライブラリの衝突を防ぐことが可能。
関連情報
最終更新: 2019-05-14
0 件のコメント:
コメントを投稿