チュートリアル / 読んで触ってよくわかる!Mayaを使いこなす為のAtoZ
第115回:Mayaの隠れた環境変数 パート2(ファイル管理系)
- Maya
- ゲーム
- コラム
- スクリプト・API
- チュートリアル
- 初心者・学生
前回のコラムでMayaの隠れた環境変数について取り上げると、すぐにAIが見つけ出して環境変数を回答するようになっていました。
あたかもAI自身が知っていたかのように断定的に語るので、このコラムでは正確な情報を出さなければというプレッシャーを感じるような感じないような…。
隠れた環境変数ではなくなってしまうのでどうも語りにくいのですが、今回も隠れた環境変数についてご紹介していきます。
前回はジオメトリ関係でしたので、今回はより幅広いユーザが関わるファイル関連の環境変数をご紹介します。スピード向上に関わるものもありますので、必見です!
MAYA_ASCII_ENABLE_THREADING
次のように設定します。起動時に初期化するため、起動後に変えても効きません。
MAYA_ASCII_ENABLE_THREADING=1
1に設定しておくと、Maya ASCIIファイルを読み込むときにスレッドが走るようになり、噂によると25%程度高速になります。
なら、なぜ初めからこれが有効になってないのだ! という話になるわけですが…。
かなり前、2015年頃に試した時のことです。
いろんなシーンでテストするとパフォーマンスが向上したり、または低下したりとマチマチ。
すべての状況で安全に読めて、確実に高速化する!
(少なくとも遅くはならない)と自信が持てるまではデフォルトの設定にできないため、いまだに環境変数で設定としています。
何を行っているかの具体的なところですが、
Maya ASCIIファイルの中身はMELスクリプトのコマンドです。
コマンドを実行する部分はマルチスレッド化されていないため、シングルスレッドで実行です。
ただ、実行するコマンドをコンパイルすることはマルチスレッドでできるので、ファイルを読んで、コンパイルするところがスレッド化されます。
ファイル読み込みはI/O部分とCPUが絡みますので、CPUだけスレッド化して速くなっても、バランスが良くないとむしろ遅くなるケースがある、というわけです。
パフォーマンスが低下した例ではネットワーク越しにファイルを開いている場合がありましたので、そのあたりで影響があるかもしれません。
でも、とりあえず環境変数を設定して、概ね高速化するようでしたら使ってもらっても問題ないです!
試しにMaya 2027 Update 1 で2GBの建物のデータを読み込んだ場合(ローカルドライブにあるファイル)
素のMaya: 15.8秒
並列読み込みあり: 9.8秒
あれ、60%向上していますね…。どのぐらい高速になるかはデータによります。
ちなみにMaya Binaryには効かないのであしからず。
MAYA_ASCII_IO_BUFFER_SIZE_IN_MB
次のように設定します。起動時に初期化するため、起動後に変えても効きません。
MAYA_ASCII_IO_BUFFER_SIZE_IN_MB=4
MB数で指定します。
Maya ASCIIで開いたり保存したりするときの、バッファサイズの大きさを指定します。
デフォルトが4MBです。環境変数がなくても4MBのバッファで読み書きしています。
この環境変数に対応したMaya 2018当時に、従来のバッファサイズよりも大きくしていますので、その後のMayaからはちょっと効率的になっているはずです。
恩恵が大きく出るところとしては、ネットワーク越しのファイルを読み書きする時です。
バッファサイズを大きくすると、読み書きのパフォーマンスが向上する場合があります。
過去の事例では概ね10MBにしておくと良い結果を得られることが多いようで、環境変数で変更するなら設定値の目安は10です。
例として、地球の裏側の、すごく低速なネットワークアクセス下にあるファイルサーバに置いた、120MBのMaya ASCII背景シーンだとこんな感じです。
MAYA_ASCII_ENABLE_THREADINGと組み合わせてテストした例です。
何も設定しない(スレッド化なし、4MBバッファ): 263秒
スレッド化なし、20MBバッファ: 257秒
スレッド化なし、10MBバッファ: 217秒
スレッド化の環境変数も有効にすると、こんな感じです。
スレッド化あり、20MBバッファ: 207秒
スレッド化あり、10MBバッファ: 140秒
スレッド化あり、4MBバッファ: 203秒
スレッド化あり、2MBバッファ: 226秒
2,3回繰り返した程度なのでバラツキも含んでいますので、目安としてどうぞ。
とりあえずスレッド化して、10MBにしておけばいいことあるかも、という具合です。
となるとおすすめの環境変数設定はこれですね。
MAYA_ASCII_ENABLE_THREADING=1
MAYA_ASCII_IO_BUFFER_SIZE_IN_MB=10
シーンがおかしい、マテリアルがついてきてないなどあれば、スレッド化の環境変数をなくしてください。
MAYA_FORCE_REF_READ
この環境変数に関しては、HIK関係のナレッジで見つかるので、一般公開してはいますが、どういうものか具体的な説明がないのでここでご紹介します。
次のように設定します。ファイル読み込み時に環境変数を毎回チェックしているはずなので、Maya起動後でも値を変えれば効きます。0より大きい値ならいいので、たぶん2とかでも有効になります。
MAYA_FORCE_REF_READ=1
ファイルリファレンスの最適化機能を「無効化」します。
基本的には最適化が効いていますが、この環境変数で無効にします。
最適化とは何かというと、大量のリファレンスを行っているシーンでは高速化するために、毎回ファイルから読み込まず、最初のものを複製しています。
これが理由で、まれに問題を起こすときがあります。
Mayaバッチ実行時に、リファレンスにMayaNodeEditorSavedTabsInfoやunknownノードがあるとクラッシュすることが報告されております。
この問題を回避するために環境変数を設定して、「リファレンスは必ず毎回ファイルを読み込んで作る」ようにすると、問題を回避できます。
(Maya 2026 Update 2 からは、自動的に問題を回避するようにしています。=unknownノードが見つかったらリファレンスの最適化はしない。)
最適化をしなければ、シーンを開くのに時間がかかるようになるかもしれませんが、まあ、それはそれということで…。
ちなみにリファレンスの最適化が効いている時は、まだ何も編集されていないノードを元に複製させる必要があります。
ユーザがトランスレータを作成している時は注意が必要です。
もしファイルI/Oに伴ってシーン内のリファレンスを変えてしまうと問題が起こるかもしれませんのでご注意ください。
virtual bool MPxFileTranslator::allowMultipleFileOptimization() const
でfalseを返すと最適化を実行させないように出来ます。
APIドキュメントにそもそもこのメソッドの記載がなくて、ヘッダファイルを開かないと気づかないし、開いても説明がないので何の効果があるのかわかりにくいですが…。
まあ、そもそもMPxFileTranslatorでプラグインを作る人は地球上に数える程度しかいなさそうですし、そういうことです。
まとめ
Maya ASCIIを日常的に使用しているユーザにとっては、今回の環境変数は試しに設定する価値があるのではと思いますが、いかがでしょうか?
ただ、上手く読めない、むしろ遅くなるという場合もありますので、動作がおかしければすぐに環境変数を削除するのも忘れず!
次回はアニメーション関係の環境変数をご紹介します。
