2019年07月11日

ビットマップペイントツールのチュートリアルをやってみた その237 3dsmax 2019

引き続きMAXScriptマニュアルに載っている「チュートリアル-ビットマップペイントツールを9つの簡単なステップで作成する」 の続きを考えて見たい。

タイムスタンプを使ってアンチエイリアシングを適用した時のプログラムの挙動を計測してみた。まだはっきりした原因はわからないんだけど、同じ条件でプログラムを走らせても、1ストロークに1300秒もかかることもあれば、300秒で終わることもある。

1 : doPaint : 0.003 秒
3 : doPaint : 6.288 秒
5 : doPaint : 43.794 秒
7 : doPaint : 0.031 秒
9 : doPaint : 4.635 秒
11 : doPaint : 53.955 秒
13 : doPaint : 82.764 秒
15 : doPaint : 3.827 秒
17 : doPaint : 12.079 秒
19 : doPaint : 465.958 秒
21 : doPaint : 624.145 秒
23 : doPaint : 11.7 秒
25 : doPaint : 0.856 秒
27 : doPaint : 3.053 秒
29 : doPaint : 13.044 秒
31 : doPaint : 1.108 秒
1 : stroke : 1329.43 秒

こっちは速かったデータ。極端に遅い時は19、21のところで大きな差が出ている事がわかる。

1 : doPaint : 0.002 秒
3 : doPaint : 12.954 秒
5 : doPaint : 31.923 秒
7 : doPaint : 0.174 秒
9 : doPaint : 10.24 秒
11 : doPaint : 60.755 秒
13 : doPaint : 70.141 秒
15 : doPaint : 5.018 秒
17 : doPaint : 7.332 秒
19 : doPaint : 30.977 秒
21 : doPaint : 37.382 秒
23 : doPaint : 9.6 秒
25 : doPaint : 2.769 秒
27 : doPaint : 1.249 秒
29 : doPaint : 9.017 秒
31 : doPaint : 3.583 秒
1 : stroke : 307.13 秒

やっぱりメモリーの使い方をもっと丁寧にやらんとダメかもね。使う分だけ確保して足りなくなったらちょっとずつ増やすみたいな方法をやってるとこんなハメになりやすいよね。

いずれにせよ上の2例では「doPaint()」は各パーティクルごとに呼び出されているはずで、下のようにパーティクルの数は16個あるので、「doPaint()」も16回呼び出されている。このシーンのフレームでは、各パーティクルが塗るサイズはさほど変らないのに上の計測結果を見ると、「doPaint()」の消費時間はとても極端な差が出ている。

fig01

消費時間が多いパーティクル上位は上のリストで太字にしてあるけど、それぞれ対応するパーティクルの番号は3,6,7,10,11なので、テンポラリファイルの該当するデータを調べてみると下のようになっている。

3,(matrix3 [0.999126,-0.00441954,-0.0415608] [0.00965818,0.991893,0.126707] [0.0406639,-0.126997,0.991069] [5.61319,-17.94,23.4052]),9.99848
6,(matrix3 [0.958674,-0.113859,0.260731] [-0.0466942,0.841035,0.538961] [-0.280649,-0.528863,0.800962] [-7.96469,-9.3661,34.4479]),9.99848
7,(matrix3 [0.869661,0.0742666,-0.488032] [0.123206,0.924679,0.360263] [0.478028,-0.373435,0.795007] [8.80356,-8.87714,34.8053]),9.99848
10,(matrix3 [0.819348,0.00327867,0.573288] [0.117825,0.977674,-0.173987] [-0.561059,0.210103,0.800668] [-8.80996,6.43056,35.9037]),9.99848
11,(matrix3 [0.945653,-0.12524,-0.300094] [-0.0393129,0.872057,-0.487823] [0.322794,0.473109,0.819739] [7.13662,7.71505,36.1643]),9.99848

変換マトリクスは最後の行が位置をあらわしているのでそれらの位置にポイントを配置してみると下のようになる(ポイントは形状を立方体にしているが、表しているのはその位置だけで方向は表していない)。

fig03

これを見て気付くのは処理が重いのパーティクルは球体の上に接しているもので、その付近はメッシュの密度が高く、ペイント対象となっている面の数が多い部分だ。

そこで一番時間を消費する11番目のパーティクルに対する「paintFace()」でタイムスタンプをとってみたら321回呼ばれている事がわかった。「paintFace()」1回で1枚のUVマップポリゴンを塗るので、上の黒い四角形の部分でくりぬかれた面が321枚あるって事になるけど、どう見ても30枚程度しかない面をくりぬいてもそんな数にはなりそうも無いのでチェックしてみないとならないようだ。

続きはまた次回。

maxまとめページ



take_z_ultima at 11:30│Comments(0)3ds Max | CG

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 

Archives