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

# 初めに
この記事は[Maya Advent Calendar 2019](https://qiita.com/advent-calendar/2019/maya)の12日目の記事になります。

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

# 全体の流れ
Mayaの画面描画を止める。
↓
重たい処理をさせる。
↓
Mayaの画面描画を再開して結果を確認する。

という流れになります。

# 画面の描画の止め方
Mayaの画面描画を止めるやり方を３つご紹介します。
## UIから画面の描画を止める(Maya2017~)
### 描画停止(UI) 
UI上から画面の描画を止めるには、赤枠で囲んだ停止ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79407/1afd638f-1b80-9abd-a30b-c3e587d5158e.png)

### 描画停止中(UI) 
実行すると作業画面が赤枠で囲まれます。
この赤枠が出ている間はMayaの画面の描画は止まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79407/78f2297d-0cb6-ea6e-857e-8295002402e6.png)

### 描画再開(UI) 
もう一度停止ボタンを押すと画面の描画が再開されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79407/1afd638f-1b80-9abd-a30b-c3e587d5158e.png)

## コマンドから画面の描画を止める(ogsコマンド/Maya2017~)
ogsコマンドのpauseフラグで描画を止めることが出来ます。

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

```python
cmds.ogs(pause=True)
```

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

```python
cmds.ogs(pause=True)
```

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

http://help.autodesk.com/cloudhelp/2015/JPN/Maya-Tech-Docs/CommandsPython/ogs.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79407/59c6b89a-cc88-b335-2389-e155af0f17c5.png)

### 使用例(ogsコマンド)
1~1000フレームまでをベイクする処理をする時は次のように書きます。

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

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

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


## コマンドから画面の描画を止める(refreshコマンド/Maya2011~)
個人的に一番よく使うやつ


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

```python
cmds.refresh(suspend=True)
```

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

```python
cmds.refresh(suspend=False)
```


### 使用例(refreshコマンド)
1~1000フレームまでをベイクする処理をする時は次のように書きます。

```python
# 描画の停止
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79407/c4ea12c4-94ed-b09e-4208-7f11adf81f04.gif)

## 使用するスクリプト
### 描画を止めないやり方
```python
"""
描画を止めないやり方
"""
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コマンドを使って描画を止めるやり方
```python
"""
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コマンドを使って描画を止めるやり方
```python
"""
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時点での測定結果なので、今後のアップデートで大きく変わる可能性があります。


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

# 最後に
時間を有意義に使いましょう！