« 撲殺アンコネクト。 | トップページ | 画像で痛ポリ。 »

2010年6月25日 (金)

AddMaterial。

スクリプトを書いていてですね、オブジェクトにマテリアルを割り当てるために、AddMaterial メソッドを使ったんですね。


そしたらですね、異様に遅いんですよ。実行が。
マテリアル1つ与えるのに、2秒か3秒くらい待たされるんですね。

ほら。
Addmat1
コンスタントシェーダ1個くれてやるのに、1.828秒もかかっています。


10回ループさせると、
Addmat2
やっぱり18秒とかかかりますね。


遅い。これでは困る。


普通にインターフェース上から Get > Material > Constant を実行したときは、一瞬で終わります。またもやオブジェクトモデルにすると遅くなるパターンなのだろうか・・・と思ったんですが、ApplyShader コマンドを使っても同じく遅かったんですよ。UI から実行すると速くてスクリプトから実行すると遅くなる? そんなのアリですか。



しかし、 Get > Material > Constant を実行したときのログを見て気が付いたんですが、
Fullpath
ApplyShader コマンドの引数で指定している Constant ですが、ディスク上の Preset ファイルを

 "$XSI_DSPRESETS\\Shaders\\Material\\Constant.Preset" 

という風にフルパスで記述してますね。

シェーダを与える時にディスク上の Preset ファイルにアクセスするらしいというのは前から知っていたのですが、今回の処理の遅さはこのアクセスに時間がかかっているのかも? と思いました。


そこで、これを真似して記述してみると、
Fullpath2
0.188秒 (゚∀゚)

10回ループで 0.188秒ですからね。さっきのは同じ10回ループで18秒かかってますから、ちょうど100倍速くなったことになります。ひゃくばいですよ。


結果的に速くなったのでまあいいんですが、何故なんだろうと腑に落ちないので、空調屋さんに聞いてみたんですよ。 そしたら、Workgroup が設定してあると遅いという事例があったとのことなんですね。 もちろん、うちの XSI 環境も Workgroup に依存してます。ないとプラグインの管理とかが大変ですからね。 

なので試しに Workgroup との接続を切ってみたら、わっ、速い。劇的に速くなりました。


どうやら、XSI はシェーダの Preset ファイルなどを読みに行くときに、先に Workgroup を探しに行くらしいんですね。 今回のように "Constant" と指定した場合、Constant.Preset ファイルを Workgroup フォルダ以下で探してしまう。 Workgroup はプラグインなど後から追加したものを入れる場所だから、当然ファクトリーシェーダである Constant.Preset ファイルは存在しないわけですよ。そして Workgroup フォルダは複数マシンで共有するという性質上、当然のようにネットワークの先のサーバに置いてあるわけで、なおさらアクセスが遅いのでしょう。 ひと通り Workgroup フォルダを探して見つからなかったら、ローカルにあるインストールフォルダ以下を探して、やっと Constant.Preset にたどり着いたけど何秒もかかっちゃったよ、ということなのでしょう。フルパスで指定すれば、ファイルの場所を明示しているということなので、すぐに Preset ファイルにたどり着けて遅延が発生しないということなのでしょう。たぶん。

ということは多分、Workgroup を設定していたとしても、その Workgroup フォルダがローカルディスク上にある場合は、ここまで処理が遅くなることはないんじゃないのかな。 ま、Workgroup がローカルにあったんじゃそもそも Workgroup の意味があまりないとは思うけど。


ということで、どうやら原因は Workgroup らしいということはわかったんだけど、Workgroup 無しに生きていけるはずもありません。なので、今後は基本的にフルパス表記で行くことにします。 幸いにも $XSI_DSPRESETS などという表記が可能なので(環境変数?って言うのかな?)、XSI のバージョンなどインストール環境に左右されない書き方が可能です。



あと、AddMaterial メソッドでもうひとつ気づいたんですが・・・・。
<p><p><p><p><p><p><p><p><p>AddMaterial (SceneItem)</p></p></p></p></p></p></p></p></p>
マニュアルを見ると、

   SceneItem.AddMaterila( [Preset] , [BranchFlag], [Name] )

とあります。第3引数は Represents the name of the new Material object つまり、「マテリアルオブジェクトの名前」 とあります。RenderTree のノードで言うこところの、一番右側、シェーダではなくマテリアルそのもののことですね。



しかし RenderTree を見てみると、
Rt
マテリアルだけでなく、コンスタントシェーダ(左)の名前まで変更されています。


これはおかしいんじゃない?
と、空調屋さんに聞いてみたら、どうやらバグ、という話でした。

なんでもこの AddMaterial メソッドには、本来はマテリアルの名前を変えるはずなのに、シェーダの名前の方を変えてしまうというバグが昔あったんですって。 そのバグは前に直されたんだけど、どうやらマテリアルの名前にちゃんと反映させる部分だけを修正して、シェーダの名前を変えてしまうという部分は修正されずに放置されたように見える、との話でした。嘔吐デスクに確認を取ったわけではないので、空調屋さんの見解ですけどね。

ま、ほら、なんとも Softimage らしいバグの残し方じゃないですか。
これでいいんですこのソフトウェアは。

なので名前は AddMaterial メソッドで指定しない方がいいですね。上の例なら、

var oMat = Selection(0).AddMaterial("$XSI_DSPRESETS\\Shaders\\Material\\Constant.Preset",false);
oMat.name = "FuckMyMaterial";


こうやって2行で書いちゃえばちゃんとマテリアルオブジェクトの方だけ名前を変更できますね。ちょっとめんどくさいけど、これで行きましょう。



ゴルァ



.

|

« 撲殺アンコネクト。 | トップページ | 画像で痛ポリ。 »

コメント

「Workgroup が設定してあると遅い」…そうだったのかぁ!
ウチではconstant割り当てるだけでもエライ時間が掛かるのが当たり前になってました。
そういえば起動も死ぬほど遅いんですよ。計ったこと無いけど何分か掛かってる感じ。
NASはそれなりの性能のものを使ってるんですけど。
XSI4からずっと使ってる、今じゃ使えない、使わないプラグインがごみ化してそうだし
Workgroupを一度作り直したほうがいいのかなぁ。

投稿: Mitsuhiro Arita | 2010年6月26日 (土) 04時28分

やあ有田さんどうもどうも。

Constant だけが異様に遅いのは、うちでも昔ありました。XSI 7 が出たばっかりの頃だったかなあ? 6 だったかなあ?  7.01 や 7.5 や 2011 ではもはやその現象はありません。

それが Workgroup に関連してるかどうかはわからないですけど、少なくともWorkgroup にわんさか色んなものが入っているとアプリの起動は遅くなると思います。

Get > Material > Constant が遅いなら、ためしに上に書いた

Selection(0).AddMaterial("$XSI_DSPRESETS\\Shaders\\Material\\Constant.Preset",false);

これ実行してみて下さい。これで速くなるなら、Constant の時だけこのスクリプト使うことにすればいいかも? 興味あるので結果教えてください。

でもインターフェース上からGet > Material > Constantとやった時に呼び出されるのが本文中の ApplyShader で、フルパスで呼び出しているんだから Workgroup うんぬんで遅くなることはありえなさそうな気もするなあ。どうなんだろ。

レポート待ってます。

投稿: junki | 2010年6月26日 (土) 12時16分

Constantは7以降早くなりました。
スクリプト使っても使わなくても実用上、差はわからないぐらいでした。
飲み会行きたかったなぁー。

投稿: Mitsuhiro Arita | 2010年7月 1日 (木) 05時00分

有田さん、ああそうか、Constant が遅い問題は過去の話だということね。失礼失礼。
打ち合わせとかでこっちに出てくる時はお知らせ下さい。飲み会やりましょう。

投稿: junki | 2010年7月 1日 (木) 12時37分

Constantは昔話なんですが、起動が遅いのはあいかわらずっで、なんとかならないのかなぁとずっと思ってます。
普通にWorkgroup設定した状態で、どのぐらいで起動します?

投稿: Mitsuhiro Arita | 2010年7月 1日 (木) 12時43分

起動に1分はかかりますね。1分半くらいかも。ネットワークの状況にもよるかもしれません。

テストとしては、まず Workgroup 切って起動してみる。そもそも Workgroup が起動を遅くしている犯人なのかどうかはこれでわかる。 仮に Workgroup が犯人だったとして、Workgroup フォルダをネットワークの先ではなくローカルディスクに置いてみる。これで速くなれば、ネットワークの遅さを解消するなりWorkgorupはローカルに置くことにするなり、対処の方向が見えるかも。

それと、使っていない Addon などを Workgroup から徹底的に削除するのもやってみるといいかもしれませんね。

有田さんの所では、レンダリング用にマシンがいっぱいあるけど作業マシンは1台、という感じなんではないでしょうか? だとしたら、Workgroup は NAS ではなくローカルに置いた方がもろもろ速いと思うんですよね。レンダ用マシンは作業マシンに常に接続して Workgroup を参照すれば良いかと。作業マシンはレンダマシンからの接続が常にあるので若干重くなるかもしれないけど、まあ若干で済むんじゃないかな。

投稿: junki | 2010年7月 1日 (木) 13時07分

1分から1分半、はかってみるとウチもそんなもんでした。
Workgroup切ったら、あっという間に起動します。
NASに置くのはRAID5だから安心、という理由とマシンとマシンつなぐと64bitと32bit混在でセキュリティソフトも数種類あるので全部を適切に設定するのが面倒という理由だったんですが…最近レンダリングもQuadマシン2台で足りてるから2台だけやればいいのか。ちょっとやってみます。
普通にモデリングしてるだけでへそを曲げると落ちまくり始めるクソビデオカードをなんとかする方が先決な気もします(^^;。20回落ちたら20分ロスですよね。恐ろしい…

投稿: Mitsuhiro Arita | 2010年7月 2日 (金) 05時48分

有田さん、ワークグループを NAS じゃなくてローカルディスクに置いたらどれくらい速いか試してみません?

もしワークグループを切った状態に匹敵するくらい速かったら、ちょっと思ったのが、XSI の起動時に NAS 上のワークグループフォルダをローカルに自動でコピーし、XSI はローカルのワークグループを読みに行くというパターンにすれば、起動速度は今よりも改善しつつ、ワークグループのデータ自体は NAS上の1個で済む、という風になりませんかね?

これが行けるなら、XSI の Setenv.bat にコピーのコマンドを書けばいい気がする。

もし、
・ワークグループをローカルに置いても大して起動が速くならない
・NASからのワークグループフォルダのコピーで時間がかかってしまう
だとすると意味ないですけどね。

実験して~ ;:゙;`(゚∀゚)`;:゙

投稿: junki | 2010年7月 2日 (金) 14時21分

ウチのNAS速度自体は速いので、細かいファイルのチェックに時間喰ってるんだと思うんですよね。
だからコピーは遅いだろうな…と思ったんですが、ミラーリングなら行けるかも。
やってみます。

投稿: Mitsuhiro Arita | 2010年7月 5日 (月) 07時18分

やってみた。
ローカルに置くと数秒で起動します(^^;。今まで待ちに費やした時間は何だったのかと…。
ミラーリングするバッチを作って、なんかインストールしたりしたときだけミラーすればOKですね。

http://www.forest.impress.co.jp/docs/special/20100630_377772.html
これなんかを使えば、オンラインストレージ上にバックアップを持ちつつ、各マシンはローカルに
workgroupを持つ、ということも出来るかも。

投稿: Mitsuhiro Arita | 2010年7月 5日 (月) 13時05分

おお、有田さん、やはり速くなりましたか。実験どうもです。いやあ、誰かに実験してもらうとラクだなあ。けけけけけけ。

ミラーするバッチは setenv.bat ファイルに書くのも手だと思うんですが、もしかしたら XSI にカスタムイベントを仕込んで、XSI を起動後にファイルのアップデートを検知してコピーを走らせるなんてことはできないですかねえ。 この場合は、XSI の Plugin Manager で Update All を押したのと同じ動作をスクリプトから記述できないとダメだと思うんですが、できるかな。

っていうか、そのリンクの Live Sync でもいいのかしら。この手のシンクツールは探せば色々出てきそうですよね。

さあ実験続けてください。
そして俺に教えて下さい。
けけけけけ。

投稿: junki | 2010年7月 5日 (月) 23時56分

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: AddMaterial。:

« 撲殺アンコネクト。 | トップページ | 画像で痛ポリ。 »