欲張りさんはダメよ
最近ツイッターばっかりで、ブログが面倒で放置してたんですが、ちょっとイケてないMayaのデータをもらう事が多かったんで、その事について触れてみようと思います。
今回のテーマ…それは
requirers!!!
このキーワードを聞いてピンと来た方は特に読まなくてもいいと思います。
ピンと来なかった方、特にモデラー、リガーなどの上流工程の方は是非熟読して今後このような間違いが起きないよう努めて頂けるとレイアウター〜コンポジターまでみんなニッコリになります。
ピンと来なかった方、特にモデラー、リガーなどの上流工程の方は是非熟読して今後このような間違いが起きないよう努めて頂けるとレイアウター〜コンポジターまでみんなニッコリになります。
長いけど頑張って下さい(。・∀・)9
■そもそもrequiresって何?
require : 必要とする事。要求する事。
と辞典さまは仰ってます。
では何を要求しているのかと言うと、ズバリ
プラグイン
です!(それ以外もありますが、問題になるところはココなんで後は割愛しますね)
■プラグインが読まれる仕組み
例えば作ったMayaのファイルでプラグインが使用されていたとします。
このノードはプラグインが読み込まれていないと作れません。
decomposeMatrixはmatrixNodesプラグインに収録されています。PluginManagerを見るとちゃんと読み込まれていることがわかります。
さて、このプラグインノードを使用しているシーンを保存します。
そしてこのシーンをプラグインが読み込まれていないMayaで読み込むとどうなるでしょうか⁉︎
↑matrixNodesのloadedを切ってからさっきのシーンを読んでみる。
答え:問題なく読み込める。
プラグインを読み込んでないと作れない筈なのに何故⁉︎と思いますが、実はMayaがシーンを開く前に勝手にプラグインを読み込んでくれているのです。
ではどうして読み込むべきプラグインがMayaにバレてるのかと言うと…
ここでrequiresが登場するわけです!
シーンファイルを保存する時、Mayaはシーンで使われているプラグインノードを見つけると、そのノードは何のプラグインを使用しているのかを特定します。
そしてそのプラグインをファイルの文頭に覚えて起きます。
それこそがrequiresコマンドなのですよ!!
↑6行目に"matrixNodes"の文字が見えます。この情報を見てMayaはこのシーンファイルがmatrixNodesを必要としている事を知り、シーンの構築前に予めプラグインをロードしておくことによって、ユーザーが任意にプラグインをロードしなくてもシーンを構成できるようになっているんですね。
超賢いっ!!!
■その賢さがアダに!
プラグインをわざわざ手動で読み込まなくても勝手に読み込んでくれるMayaちゃん偉いっ!!!
ってとこなんですが、この賢さがアダになる事があるのです。
これこそが今回のテーマ、requires問題っ!!!!
では一体どういう問題が起こるのかっ!!?
それは、requiresの行が大量に増えてしまい、ファイルのロードに影響が出てしまうことがあるのです。
requiresにかかれているプラグインがすべてシーンを構成するのに必要ならば仕方ないのですが、プラグインによっては一度ロードしてしまうと使ってないのにシーンに情報を残してしまい、requiresに出現するものがあります。(特にレンダラーなど)
一度こうなったシーンは、次回開き直してシーンをクリーンアップしても情報が残り続ける場合があるだけでなく、このシーンを他のシーンにインポートすると・・・
インポートされたシーンまで感染します・・・
ヒィぃぃぃぃぃぃぃ、恐ろしいっ!!
あるシーンの中のシェーダを使いたいと思ってインポートし、インポートしたシェーダ以外を削除しても、そのシーンにはrequiresの情報が残っている事があるのです。
これを繰り返すことにより、シーンの中にはrequiresがたまり続け、最後は怨霊となって下流セクションに襲いかかるのです。
↓信じられるかい・・・これ、全部requiresなんだぜ。
■何が問題なの?
とりあえずプラグインで必要な情報が書いてるわけですけど、じゃぁこれの何が問題なんでしょう?
1.個人情報が漏れる
自社プラグインなどには識別できるようにプラグインの名前に会社のコード名を入れている場合があります。このため知っている人が見ればrequires行から取引先の会社の推測が出来てしまう場合があります。
守秘義務があってもこんなところからバレてしまう場合が・・・
2.ファイルの読み込みが遅くなる
一番の問題はコレかもしれません。
環境にもよりますが、このrequiresが80行とか100行とかになってくると、ファイルのロードに深刻な影響が出かねません。
特に組織の場合、Mayaのモジュールパスを結構な数通していて、さらにrequiresが100行近くあるととんでもない事になります。
ちなみにrequiresが1行あるたびにMayaはプラグインパスが通っているところにプラグインがないかを探しに行きます。もしプラグインパスが20箇所通してあって、requiresが100行あった場合、20×100で2000回ディレクトリの中を見に行くことになります。
仮に一つのディレクトリを見るのに0.01秒だとしても、2000回見れば20秒かかる事になります。
アニメータがもし10アセット(例えばキャラ5体、プロップ4個、背景1個みたいな構成)リファレンスしているファイルを開くと、このrequiresの処理だけで200秒、つまり3分20秒分かかることになります。
読み込み時間じゃないですよ?読み込む準備時間だけで3分ですよ!
ウル○ラマンがスーパーバイザーだったら、チェックファイル見ることなく力尽きちゃいますからね!!
■どうやって消しましょう?
ではどうやったらこの問題を解決できるのか?何点か考えられる方法を出してみます。
1.ファイルはエクスポートする。
誰かに渡すデータならば、まずはSaveSceneではなくExportSelectionで必要なものだけ出すように心がけましょう。
自分が使うだけのファイルならばSaveでも構いませんが、相手に渡すデータの場合は基本的にExportSelectionしましょう。(カットシーンとかは別ですよ)
2.ma保存後、テキストエディタで直接関係なさそうなrequires行を消去する。
ExportSelectionでも消えないrequiresは存在します。なので、最悪の場合、テキストエディタで開いて直接消去します。
テキストエディタとしてはNotepad++やsakuraEditorなんかを推奨しています。間違ってもWindows標準のメモ帳とかでやってはいけません。最悪データが読めなくなりますので。
そしてセーブしたらもう一度再起動したMayaで開き直してデータを確認してみましょう。
3.そもそも不要なプラグインを入れない。
上記のようにプラグインは不要な情報をシーンに追加してしまう可能性があります。
ですので使わないプラグインはそもそも消してしまいましょう。あってもMayaの起動が遅くなるだけですしいいことがありません。
4.コマンドで消す。
(2017年9月14日追記)maya2016からunknownPluginと言うコマンドが追加されていました。
from maya import cmds unknown_plugins = cmds.unknownPlugin(q=True, l=True) if unknown_plugins: for p in unknown_plugins: cmds.unknownPlugin(p, r=True) print('Removed unknown plugin : {}'.format(p))
試してみたら問題なくキレイに消えてました!2016以降ならこれが一番良さそうですね。
ただし、2015まではないのでまだ2015をご使用の方(主にプロダクションだと思いますが)はご注意!
TOMMY_RUMMYさん、有益な情報のご提供ありがとうございます!!
■終わりに
requiresは非常に有効な機能ですが、これが時に甚大な被害をもたらす原因になる事があります。
有名なところですと、Maya2014以降選択式になり、2017ではついにレギュラーメンバーからはずされたMentalrayの怨霊なんかがたまに火を噴くときがあります。(本当にレンダリングできなくなるときがあるんですよ!)
RenderLayerまで組んでしまったシーンではクリーンアップはなかなか難しいですが、モデル、リグの段階でしたらrequiresなどやクリーンアップはそんなに難しくありません。
そしてこの細かいデータ整理が後の工程に大きく影響するので、上流工程の方は特に気をつけてもらえると、下流工程の人が早く帰れてイライラの減少に貢献できますよ!
また、ファイルを開く時に妙に遅いなぁと感じたら、maを開けてrequiresを疑ってみて下さい。
(実際、80行あるrequiresを削ったらロード時間が8秒→0.7秒まで早くなったケースも・・・)
スポンサーサイト