[TouchDesigner] 動画のカクつきを抑える

![td_final.png](https://qiita-image-store.s3.amazonaws.com/0/127402/7bf761ad-7279-cf92-24e4-f77274661578.png)

# 前置き
高解像度の動画をTouchDesigner上で再生すると、環境によってはコマ落ちや、ティアリングが発生します。
これを防ぐにはいくつかの設定項目があり、主に

- **ソース動画のHapQエンコード**
- **MovieFileIn TOPのTune設定**
- **TouchDesignerのFPS設定**
- **Perform Window(またはWindow COMP)のV-Sync設定**
- **ビデオカードの垂直同期設定**

を環境に合わせて調整してあげると良いようです。
(故にこの記事は万人共通な内容ではないことになりますが...)

# 環境

- CPU : Intel Core i7-6770 3.4GHz
- GPU : NVIDIA GeForce GTX 1080
- TouchDesigner 088
- ディスプレイ1080p × 4枚
- 動画(HapQ, AVI) 1920 × 4320 3分 18GB 30fps

# Hapエンコードについて

TouchDesignerでは、動画エンコーディング方法に**HapQ**を推奨しています。
[Hapエンコードについて - TouchDesigner]
(https://www.derivative.ca/wiki088/index.php?title=Hap)

HapQとは、高精細な動画をリアルタイムアプリケーションで使用する際によく用いられるエンコード方法で、ディスク容量を消費する代わりにCPUデコードにかかる時間を短縮することができるという特徴があります。

動画のHapQエンコード手法はこちらのサイトに詳しく掲載されています。
[ffmpeg で高速低負荷な Hap コーデックの動画に変換する - NEAREAL](http://neareal.com/2675/)

# MovieFileIn TOPの設定

MovieFileInTOPで動画を読み込む際、パラメータウィンドウの「Tune」タブで動画の読み込み設定を行うことができます。
![mfi.png](https://qiita-image-store.s3.amazonaws.com/0/127402/6ec5230f-3c23-82ca-5f45-5275f07944cb.png)


この中で、動画の高速読み込みに貢献するパラメータが、

- Pre-Read Frames : 先読みフレーム数
- Max Decode CPUs : デコードに使用する最大コア数
- High Performance Read : 高性能読み取り機能
- High Performance Read Factor : 高性能読み込み係数

の4つとなります。
特に下の2つは分かりにくいので、公式ドキュメンテーションを見てみましょう。
引用 : [MovieFileInTOP - TouchDesigner](https://www.derivative.ca/wiki088/index.php?title=Movie_File_In_TOP)

> **High Performance Read** - 4Kを超えるHapQファイルのような、SSDの高速読み込みを必要とするファイルを再生するときに使用します。これにより大幅に読み込みパフォーマンスを向上させることが可能です。この機能は1080pH264ファイルのような低解像度または低容量のファイルには使用しないでください。

>**High Performance Read Factor** - HighPerformanceReadを行う際、ディスク上で実行される読み取り操作のデータ量を制御します。コーデックが実行する最大の読み取り容量が何であれ、これに読み取り係数を掛けて、その後のすべての読み込みでは指定された読み込みデータ量よりも多くのデータが読み込まれます。 これにより、ドライブの種類によってはより多くの情報量を扱うことが可能になります。例えば、1MBの読み込み命令に対して読み取り係数が3であった場合、1MBの読み込み命令の代わりに3MBの読み込みを行い、次のフレームではフレーム自身の1MBのデータ量に加えて2MBも多く使用することが可能になり、CPU上のRAMでは2フレーム先読みしたことと同義になります。

これらの設定を変更し、最善の出力となるパラメータを探していきます。
得られたパラメータは以下でした。
![res.png](https://qiita-image-store.s3.amazonaws.com/0/127402/a406c93d-1cfa-d0d7-1a72-75813c696df4.png)

- Pre-Read Frames : 10
- Max Decode CPUs : 4 (ご自身のCPUコア数に合わせてください)
- High Performance Read : On
- High Performance Read Factor : 1

High Performance Read Factorに関しては、どの値でも変化はに見受けられませんでした。

# TouchDesignerのFPS設定
TouchDesignerの左下にあるFPS設定を60に変更してください。
![2017-02-07_170838.png](https://qiita-image-store.s3.amazonaws.com/0/127402/4a848d24-eca5-1e2e-995f-fbdffd630811.png)

近年のディスプレイの標準的なリフレッシュレートは60fpsなのに対し、ソース動画は軽量化のために30fps前後である場合が多いです。ソース動画が30fpsであることから、TouchDesigner上の実行FPSを30に抑えがちですが、リフレッシュレートとの整合性が取れなくなるため、**避けた方が良いです**。

# 出力WindowのV-Sync(垂直同期)設定
TouchDesignerで映像を出力するには、Window COMPを経由する必要があります。そのWindow COMPには垂直同期の設定があり、これを**FPS is Half Monitor Rate**に変更します。
![2017-02-07_171244.png](https://qiita-image-store.s3.amazonaws.com/0/127402/06e234e3-21fd-682f-a282-829607e13d2d.png)
これにより、FPSをリフレッシュレートの半分に合わせることができ、30fpsのソース動画を60fpsとして解釈可能になります。

# ビデオカードの垂直同期設定
この部分は各ビデオカードのドライバに沿って設定を行ってください。
今回は、NVIDIAコントロールパネルを使用します。

3D設定 -> 3D設定の管理 -> グローバル設定 -> 設定 -> 垂直同期 : **適応**

に設定してください。

# おわりに
以上の工程で、自分の環境では動画のカクつきを抑えることができました。
公式にもカクつきを防ぐ方法についての記載がありますので、そちらについても参照してみてください。
[Stuttered Playback - TouchDesigner](https://www.derivative.ca/wiki088/index.php?title=Stuttered_Playback)