作業シーンのFPSについて

~~投稿日の前日に熱海旅行をしていたら記事の存在が頭から消え去りました。すいません。~~
気を取り直してmayaの描画fps周りを書いていこうと思います。

~~温泉は最高でした。~~

### 検証環境
- Windows 10
- Xeon E5-2683 v3 @2.00GHz
- Maya2017 Update5
- Maya2019 Update2

## 現状のパフォーマンスを測る
今回は公式で配布されている、モーションキャプチャデータを使用します。
`http://www.autodesk.com/maya-creativemarket-samples` *アクセスするとダウンロードがはじまるのでテキストとして載せておきます。*
約3200ポリゴンのモデルにHIKが仕込まれており、歩きのモーションキャプチャデータがベイクされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255056/ce16cc29-7322-6cbe-3c2b-fcd9e0d39370.png)


現状のパフォーマンスを測るのに[Evaluation Toolkit](https://knowledge.autodesk.com/ja/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2017/JPN/Maya/files/GUID-E22B253D-914B-4056-93F5-755702A6C998-htm.html)を使用します。09) Validationのパフォーマンステストを走らせます。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255056/e653c84a-eaa3-fdc2-e05b-a8c9cc892389.png)

実行するとスクリプトエディタにこのような結果が返ってきます。

```
Playback Speeds
    DG  = 145.631 fps
    EMS = 180.723 fps
    EMP = 200 fps
```

DGはその名の通りDGでの評価時のfpsです。
一つ飛ばしてEMPはParallel評価時のfpsです。
真ん中のEMSはParalell評価を並列せず、単体で処理した場合のfpsです。
体感でDGとEMSではEMSのほうが低くでることのほうが多いです。

EMPの値が振り切ってしまっているので、もう少し重いシーンを作ります。
複製して20万ポリぐらいに増やしたモデルを先ほどのモデルを**wrap**してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255056/8d935fae-ba6d-b9b7-089a-957fd7ade43b.png)

```
Playback Speeds
===============
    DG  = 6.63423 fps
    EMS = 6.0048 fps
    EMP = 6.07042 fps
```

だいぶ重くなりましたね。
DGとEMPでの差がないどころか下がっています。

## DGでの向上

Profilerで覗いてみると、wrap部分にかなり処理がかかっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255056/d239bf1c-93e2-c5ae-c8a3-6a1f3232f031.png)

wrapは便利ですが、処理に時間がかかっているのでskinBindに置き換えてみると、このような結果が返ってきました。

```
Playback Speeds
===============
    DG  = 39.7878 fps
    EMS = 21.7707 fps
    EMP = 26.362 fps
```
wrapを取り除いたことで、全体的にfpsが向上しましたが、DGのほうが良い結果になりました。
あれ？Parallelって早くなるんじゃないの？？

考えてみると、いくら重いメッシュを用意しても最終的に出力されるメッシュが一つのみであれば並列処理の恩恵が少ないです。（むしろDGのほうが良い？）
このような単純なシーンではDGでのパフォーマンス向上に努めたほうがシーンのfpsを向上させることができそうです。

## Parallelの恩恵を受けるには
試しに20万ポリのモデルを5体別々にwrapしたシーンを測定しました。

```
Playback Speeds
===============
    DG  = 1.37665 fps
    EMS = 1.22931 fps
    EMP = 3.21337 fps
```

最終的に出力されるメッシュが増えたことで並列化の恩恵をうけることが出来ました。
最終出力されるメッシュが多い場合はParallel化を検討したほうがよいかもしれません。

## Cached Playbackを使う
maya2019より、Cached Playbackという新機能が追加されています。詳細はこちらに
[キャッシュされた再生(Cached Playback)のプリファレンス](https://knowledge.autodesk.com/ja/support/maya/getting-started/caas/CloudHelp/cloudhelp/2019/JPN/Maya-Customizing/files/GUID-3CB35662-DB1D-4CF3-9135-E09B973635DE-htm.html)

先ほどの5体wrapしたシーンでビューポートキャッシュの検証をしてみます。
特にキャッシュを取らない状態だとこのような結果になりました。
maya2017と同じシーンで検証していますが、EMPで少しだけ向上していますね。
~~まあ誤差ということにしておきましょう。~~

```
Playback Speeds
===============
    DG  = 1.38479 fps
    EMS = 1.18671 fps
    EMP = 3.90829 fps
```

左下のこのボタンをアクティブにすることでキャッシングが始まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255056/748823fe-cb4f-1293-c1bc-54a3f57a281b.png)

カレントタイムから前後にキャッシングが始まりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255056/23a3ec3f-593e-4e82-fcec-de7cf5e9058c.png)

キャッシング中にメモリ不足に陥ったときはプリファレンスからRAM上限を上げてください。
デフォルトは50％に設定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255056/15660df7-62e6-b60c-448e-f162a880e1bf.png)

キャッシングした状態でValidationのCachingで計測します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255056/82c9804b-1992-9439-98c2-db1df72114ad.png)
キャッシング後は動かした部分のみの計算になるのでアニメーション作業なども
かなりの効果が得られそうです。

### まとめ
最終出力が単一の場合はDGでの向上を。
複雑で重いシーンほどParallelの恩恵が大きい。
Cached Playbackは数fpsのシーンでもほぼリアルタイムのfpsまでもっていける。

細かいテクニックというより検証＆簡単な考察となってしまいましたが、
何か参考になればと思います！