23
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

画面の描画を止めてベイクの待ち時間を減らすテクニック

Last updated at Posted at 2019-12-11

初めに

この記事はMaya Advent Calendar 2019の12日目の記事になります。

CGアニメーション制作ではありとあらゆる工程でベイク待ちという不毛な待ち時間が発生してしまいます。
今回はベイク作業の待ち時間を少しでも減らすテクニックをご紹介します。

全体の流れ

Mayaの画面描画を止める。

重たい処理をさせる。

Mayaの画面描画を再開して結果を確認する。

という流れになります。

画面の描画の止め方

Mayaの画面描画を止めるやり方を3つご紹介します。

UIから画面の描画を止める(Maya2017~)

描画停止(UI)

UI上から画面の描画を止めるには、赤枠で囲んだ停止ボタンを押します。
image.png

描画停止中(UI)

実行すると作業画面が赤枠で囲まれます。
この赤枠が出ている間はMayaの画面の描画は止まります。
image.png

描画再開(UI)

もう一度停止ボタンを押すと画面の描画が再開されます。
image.png

コマンドから画面の描画を止める(ogsコマンド/Maya2017~)

ogsコマンドのpauseフラグで描画を止めることが出来ます。

描画停止(ogsコマンド)

以下のコマンドを実行すると画面の描画が止まります。
UIから実行したように画面が赤線で囲まれます。

cmds.ogs(pause=True)

描画再開(ogsコマンド)

描画を再開する時も同じコマンドを使います。

cmds.ogs(pause=True)

maya2017以前だと...

Maya2017以前のogsコマンドにはpauseフラグが存在しないので、この機能は使えません。

http://help.autodesk.com/cloudhelp/2015/JPN/Maya-Tech-Docs/CommandsPython/ogs.html
image.png

使用例(ogsコマンド)

1~1000フレームまでをベイクする処理をする時は次のように書きます。

# 描画の停止
cmds.ogs(pause=True)

# ベイク処理
cmds.bakeResults( bakenodes, t=(1,1000), simulation=True )

# 描画の再開
cmds.ogs(pause=True)

コマンドから画面の描画を止める(refreshコマンド/Maya2011~)

個人的に一番よく使うやつ

描画停止(refreshコマンド)

以下のコマンドを実行すると画面の描画が止まります。
ogsコマンドのように画面に赤枠は表示されません。ただ画面が止まるだけです。

cmds.refresh(suspend=True)

描画再開(refreshコマンド)

描画を再開する時も同じコマンドを使います。

cmds.refresh(suspend=False)

使用例(refreshコマンド)

1~1000フレームまでをベイクする処理をする時は次のように書きます。

# 描画の停止
cmds.refresh(suspend=True)

# ベイク処理
cmds.bakeResults( bakenodes, t=(1,1000), simulation=True )

# 描画の再開
cmds.refresh(suspend=False)

描画停止状態と描画状態での処理速度の比較

画面停止した状態/画面描画停止していない状態でベイクにかかる時間を計測してみたいと思います。
maya2019/maya2018/maya2017/maya2015のそれぞれで比較してみます。

使用するデータ

簡単なHairシミュレーションのベイクにかかる時間を計測。
ベイク範囲は1~1000Fまで。
ベイクするJointの総数は91本。
Mayaの評価モードはDGで固定。
bake.gif

使用するスクリプト

描画を止めないやり方

"""
描画を止めないやり方
"""
import time
# 計測開始
start = time.time()

# ベイク処理
bakenode = cmds.ls('bake_joint*')
cmds.bakeResults( bakenode, t=(1,1000), simulation=True )

# 計測終了
elapsed_time = time.time() - start
print (u"処理時間:{0}".format(elapsed_time) + "[sec]")

ogsコマンドを使って描画を止めるやり方

"""
ogsコマンドを使って描画を止めるやり方
"""
import time
# 計測開始
start = time.time()

# 描画停止
cmds.ogs(pause=True)

# ベイク処理
bakenode = cmds.ls('bake_joint*')
cmds.bakeResults( bakenode, t=(1,1000), simulation=True )

# 描画再開
cmds.ogs(pause=True)

# 計測終了
elapsed_time = time.time() - start
print (u"処理時間:{0}".format(elapsed_time) + "[sec]")

refreshコマンドを使って描画を止めるやり方

"""
refreshコマンドを使って描画を止めるやり方
"""
import time
# 計測開始
start = time.time()

# 描画停止
cmds.refresh(suspend=True)

# ベイク処理
bakenode = cmds.ls('bake_joint*')
cmds.bakeResults( bakenode, t=(1,1000), simulation=True )

# 描画再開
cmds.refresh(suspend=False)

# 計測終了
elapsed_time = time.time() - start
print (u"処理時間:{0}".format(elapsed_time) + "[sec]")

計測結果

追記 parallelモードでの計測結果を追記しました。

Maya2019.2で作成した検証用データを各バージョンで開いて計測。
DGモードとparallelモードで計測。
ogsコマンドとrefreshコマンドの時には画面描画を停止

▼評価モードDG

Maya そのままベイク ogsコマンド refreshコマンド
maya2019 60.34s 32.31s 43.90s
maya2018 59.15s 31.56s 45.97s
maya2017 55.93s 25.34s 31.18s
maya2016 51.18s None 20.76s
maya2015 47.82s None 17.21s

▼評価モードparallel

Maya そのままベイク ogsコマンド refreshコマンド
maya2019 17.34s 15.80s 14.87s
maya2018 18.78s 16.17s 19.69s
maya2017 16.84s 13.92s 12.94s
maya2016 46.50s None 20.14s
maya2015 None None None

parallelモードがかなり優秀ですね!
またDG/parallel共に画面の描画を止めた方が処理速度は上がっています。

個人的な経験則ではこの速度差は扱うデータが大きくなればなるほど差は開きます。
ベイクに10分掛かるものだと2分程度になったり・・・!

※2019年12/12時点での測定結果なので、今後のアップデートで大きく変わる可能性があります。

その他の使い道

アニメーションのベイク以外にも、
ジオメトリキャッシュの出力時やシミュレーションのキャッシュの保存時にも画面描画停止は有効です。

最後に

時間を有意義に使いましょう!

23
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?