Mayaでのプラグイン作成におけるマルチスレッド化
2013/7/29
はじめまして、開発室の高田です。MayaとMotionBuilderのプラグイン開発をしています。
今回はMayaでのプラグイン作成におけるマルチスレッド化を実現する方法として、
比較的実装が容易なOpenMPについて紹介します。
マルチスレッド化を実現する方法としては、OpenMPのほかに以下のようなものがあります。
● TBB (Intel Threading Building Blocks)
● OS固有のスレッド化ライブラリ (Win32 thread)
では、Mayaに付属しているデフォーマのサンプルプラグイン「splatDeformer」を例にして、
OpenMPでのプロジェクト設定~パフォーマンス測定までを簡単に見ていきます。
[設定方法(Microsoft Visual Studio)]
プロジェクトのプロパティページ ⇒ 構成プロパティ ⇒ C/C++ ⇒ 言語 ⇒ OpenMPのサポート を
『はい (/openmp)』 に設定します。
[実装方法(C++)]
MThreadUtils.hをインクルードします。
マルチスレッド化したいforループの直前に以下のようなコードを記述します。
[実行方法(MEL)]
Mayaが使用するスレッド数(論理CPU数)を設定します。
[測定方法]
インフルエンスオブジェクトの頂点に伸縮するアニメーションをつけて
ターゲットオブジェクトをデフォームさせた時の
設定したスレッド数に対するパフォーマンスを測定します。
インフルエンスオブジェクト・・・100Faceの球体
ターゲットオブジェクト ・・・ 100,000Faceの球体
測定方法1・・・フレームレート [fps] (ディスプレイ ⇒ ヘッドアップディスプレイ ⇒ フレームレート)
測定方法2・・・計算時間 [ms] (ウィンドウ ⇒ 一般エディタ ⇒ DG プロファイラ ※1)
※1 すべてのノードのプロファイリングデータを生成します。dgProfiler.mllプラグインをロードする必要があります。
[測定結果]
マルチスレッド化することでフレームレート・計算時間共に約6倍のパフォーマンス向上が見られました。
——————————————————————————————————————————————————
[補足]
getClosestPoint関数を使用したデフォームでは、インフルエンスオブジェクトの形状により
ターゲットオブジェクトの頂点に疎密が発生する場合がありますので注意して下さい。
(画像上:splatDeformer適用前、画像下:splatDeformer適用後)
——————————————————————————————————————————————————
[あとがき]
Mayaでのプラグイン作成におけるマルチスレッド化に関しては注意すべき点が非常に多くあります。
Mayaのドキュメント(APIガイド ⇒ マルチスレッド化プラグイン)やOpenMP関連のサイトなどを参考にして下さい。
[参考] APIガイド ⇒ マルチスレッド化プラグイン
——————————————————————————————————————————————————
※免責事項※
本記事内で公開している全ての手法・コードの有用性、安全性について、当方は一切の保証を与えるものではありません。
これらのコードを使用したことによって引き起こる直接的、間接的な損害に対し、当方は一切責任を負うものではありません。
自己責任でご使用ください。
コメント
コメントフォーム