2019年07月04日

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

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

プログレスバーを付けて見たけど、処理が重くなるとプログレスバーの更新が遅延するようになって、何の役にも立たない状態になってしまうようだ。

そこでどのあたりがどのくらい時間を食うのかを経過時間を計って出力させて調べてみることにした。

下のコードで「gts」にオブジェクトを入れて、「stamp()」をコメントと管理番号を付けて呼び出せば、呼び出された回数、コメント、前に同じ管理番号の「stamp()」が呼び出されてからの経過時間が「MaxScriptリスナー」に出力されるようにしてみた。

struct timeStampObject (
  private
    lasttime = #(),
    count = #(),
  public
    fn stamp mess n = (
      if lasttime[n] == undefined then (
        lasttime[n] = timeStamp()
        count[n] = 0
      )
      ctime = timestamp()
      if mess != "" then (
        format "% : % : % 秒\n" count[n] mess  ((ctime - lasttime[n]) / 1000.0)
      )
      lasttime[n] = ctime
      count[n] += 1
    ),
    
    fn reset n = (
      lasttime[n] = undefined
      count[n] = 0
    ),
    
    fn resetAll = (
      lasttime = #()
      count = #()
    )
)

gts = timeStampObject()

例えば下のコードは「doPaint()」の処理時間を計測するために2行挿入したものだ。最初の行ではコメントが「””」になっているのでこの呼び出しでは何も出力せずに、この位置を計測のスタート時間として次に呼び出される時までの時間を計測するようにしている。そして下の行では「doPaint」のコメントと共に、この管理番号2番が今まで何回呼び出されたか、前回からの経過時間は何秒なのかが出力される。

    fn doPaint = (
      gts.stamp "" 2
      local theMesh = snapshotAsMesh theObj
      local theChannel = 1
      maps = #()
      crossFaceMaps  theMesh theChannel mt2b
      checkBitmap = #{}

      dprg = 100.0 / maps.count
      prgPaint.value = 0
      for map in maps do (
        if map[1].count >2 then paintFace map[1] map[2]
        prgPaint.value += dprg
      )
      gts.stamp "doPaint" 2
      
    ),

下は出力されたデータの一部分。

3063 : paintFace : 0.087 秒
3065 : paintFace : 0.022 秒
3067 : paintFace : 0.01 秒
39 : doPaint : 0.37 秒
3069 : paintFace : 0.001 秒
3071 : paintFace : 0.005 秒
3073 : paintFace : 0.0 秒
3075 : paintFace : 0.0 秒
3077 : paintFace : 0.0 秒
3079 : paintFace : 0.0 秒
41 : doPaint : 0.054 秒
3081 : paintFace : 0.001 秒
3083 : paintFace : 0.004 秒
3085 : paintFace : 0.007 秒

また、「gts」をリセットするために「run()」の冒頭で「resetAll()」を呼んでいる。

fn run = (
  gts.resetAll()
    
  pt.BrushShape = ParticlePaint_Rollout.BrushShape.state
  pt.brushsize = ParticlePaint_Rollout.BrushSize.value
  pt.BrushColor = ParticlePaint_Rollout.inkColor.color 

実際これで走らせて見ると実行途中で沈黙していたプログレスバーがちゃんと更新されたりするし、アンチエイリアスをONにしてもせいぜい時間が3倍程度しかかからなくなった。

いつも使っている球体にパーティクルを落すテストで1フレーム分の処理時間を計ってみたら、AAなし、512X512ピクセルで10.3秒で、AAありで33.3秒だった。これがなぜかタイムスタンプを出力させないと、何分も待たされるような事が起きる。

よくわからん・・・orz

続きはまた次回。

maxまとめページ



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

この記事にコメントする

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

Archives