--

--.--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサー広告:  トラックバック(-)  コメント(-) 

    2009

06.28

Nif Optimization

作成:RAZORWINGSilgrad Tower[外部]
目次
1 背景
2 導入
3 エクスプローラからスクリプトを使う
3.1 スクリプトを実行する
3.2 設定
4 コマンドプロンプトからスクリプトを使う
4.1 スクリプトを実行する
4.2 コマンドラインオプション
4.2.1 簡単なオプション
4.2.2 上級者向けのオプション
5 FAQ

1 背景

Silgrad Tower[外部]チームのRazorwingといいます。もし私と同じように3D Studio Maxのユーザで、amorilia[外部]のスクリプトを使ったことがないのであれば、この情報を読みたいと思ったに違いありません。
まずごくありふれた宣言をしておきますが、この方法は各自の責任の元に使用してください。100%の成功を保証するものではありませんし、なにか問題が起きるかもしれません。ただ私に言えるのは、自分で使ってきた範囲では特に問題は起きたことがありません、ということだけです。
3D Studio Max exporterはNiftoolsグループによって作成されています。プログラム内でそのままにCollisionを設定できる機能を、ましてや素晴しい凸面モデルを作成する機能を愛せないわけではありません。しかし、exporterには欠陥が一つあります。しかも不運なことにこの欠陥は非常に深刻です。目には見えず必要でもないFaceが数百、時には数千にまで膨れ上がってしまうこともあるのです。もしこれにお気づきでなかったのでしたら、3D Studio Maxでモデルを開き、右クリックから「Properties...」を選択してみてください。どのくらいのFaceがあるか、プログラムが教えてくれるでしょう。さて、NIFファイルをNifSkopeで開き、NiTriStripsDataブロックのBlock Detailsにある『Num Triangles』を見てみましょう(NiTriStripsが複数ある場合は電卓でも使ってください)。Construction SetのRender Windowでモデルを選択した時に、ステータスバーにも表示されます。

3D Studio Maxで出力したWooden Cup。Faceは779面。
Wooden Cupの場合ですと、NifSkopeでは779面だと表示されるにもかかわらず、3D Studio Maxは219面のFaceがあると表示されました。言い換えれば、出力する行程でモデルが350%(!)にまで膨れ上がってしまったということです。もし家の中にWooden Cupを10個ほど配置したとすると、面数を5,500面も浪費してしまうことになるのです。Silgrad Towerのように自作モデルを沢山使用する場合、この問題が内装にどれほど悪影響を及ぼすか想像に難くありません。たとえば、私たちが作っていた宿の開発は、面数が上限、つまり452,349面を越えてしまったために中止しました。回避するには、Cellを二つに分割するしかありません。ですが、amoriliaのスクリプトを前述の宿モデルに実行してみたところ、宿モデルの面数は驚くなかれ、一気に284,257面にまで減少したのです!
面数が膨張してしまう問題は、3D Studio MaxでもNifSkopeでも解決できません。NifSkopeを使って再度Strip化し、多少なりとも最適化することは不可能ではありませんが現実的ではありませんし、逆に面を増やしてしまうことになりかねません。Strip化せずに面を節約する方法もないわけではなく、3D Studio Maxの出力パネルで『Generate Strips』チェックを外せばできそうですが、これは一番よくない手段です。私はその方法について説明するつもりはありません。なぜこの方法を使用しないのか、という疑問が湧いた場合にのみ言及するつもりでした。

amoriliaスクリプトを適用した後のWooden Cup。Faceは219面。
しかし運のいいことにBlenderのexporterは、3D Studio Maxのexporterにあるような、膨れ上がる問題はありません。また感謝すべきことに、amorilla、つまりNiftoolsのBlender Script開発を束ねる人物は、Blender外部でNIFファイルを最適化するスクリプトを作成してくれています。しかもありがたいことに、そのスクリプトは作成したモデルをUpdates Tangent Spacesしてくれます。これは本当に時間を節約してくれます。Updates Tangent SpacesアルゴリズムはNifSkopeのものと同じようです。3D Studio MaxのexporterにあるUTS Functionはやや質が悪いようですが(といってもUTSがないよりはずっといいです)。
このスクリプトはNifSkopeとは別の言語で書かれています。そのため、将来的にNifSkopeと統合されることはないと思っていいでしょう。とはいえ、このスクリプトを使う利点もあります。Import、再度ExportなどといったBlenderを使う動作をBatch処理できることです。

2 導入

スクリプトを動作させるには、PythonとPyFFIが必要です。Pythonはオープンソースのプログラミング言語で、PyFFIはNIFファイルとの橋渡しをするインターフェイスです。
  • Python 2.5[外部]をインストールします(デフォルトのC:\Python25にインストールしたものとして話を進めます)。
  • PyFFI[外部]をインストールします。

3 エクスプローラからスクリプトを使う

3.1 スクリプトを実行する

とりあえず使用するのであれば、エクスプローラから実行することが可能です。
  • 最適化したいNIFファイル上で右クリックします。
  • 『Optimize with PyFFI』を選択します。
  • DOSウィンドウが開き、処理を実行するか尋ねてきますので、Yキーをタイプし、Enterを打ち込んでください。
  • 最適化の結果を見ることができます。
  • 最適化されたNIFファイルをNifSkopeやゲームで実際に見て、欠損がないことを確認してください。もしこのスクリプトのせいでNIFファイルの見た目が変わってしまった場合は、Niftools Forum[外部]に報告してください。

3.2 設定

以下のコマンドライン節では、コマンドラインからスクリプトを実行する場合の種々の設定全てを見ることができます。右クリックのコンテキスメニューからもスクリプトを設定することができます。
なんでもいいのでフォルダを開き、『ツール(T)→フォルダ オプション(O)』を開きます。ファイルの種類タブでNIFのエントリを探し、詳細設定(V)ボタンを押します。『Optimize with PyFFI』を選択し、『編集(E)...』ボタンを押しましょう。
『アクションを実行するアプリケーション(L):』の下にあるテキストボックスには、以下のように書かれているはずです。
"C:\Python25\python.exe" "C:\Python25\Scripts\niftoaster.py" --pause optimize "%1"
--pauseと"%1"の間に新しくオプションを追加することができます。たとえば、
"C:\Python25\python.exe" "C:\Python25\Scripts\niftoaster.py" --pause -x NiMaterialProperty optimize "%1"
とすれば、コンテキストメニューNiMaterialPropertyブロックを最適化したくない場合に使用できます。

4 コマンドプロンプトからスクリプトを使う

NIF最適化スクリプトの上級者向け機能を使用したい場合、たとえば、大量のNIFファイルをひとつのコマンドでバッチ処理したいとか、最適化から特定のブロックタイプを除外するとか、そういう場合にはコマンドプロンプトを使ってスクリプトを実行する必要があります。コマンドプロンプトの使用に慣れていない場合も心配はありません。全行程を説明してあります。

4.1 スクリプトを実行する

  • Cドライブに『nifoptimize』という名前のディレクトリを作成します(この名前はどうしてもというわけではありませんから、好きな名前にしてください)。
  • 最適化する予定のNIFファイルを、作業をする前に全てバックアップしてください。バグやトラブルが起きてしまった場合、NIFが崩壊し、破壊されてしまいます。
  • 最適化したいNIFファイルを『C:\nifoptimize』にコピーします。
  • スタートメニューからファイル名を指定して実行(R)を選択し、cmdとタイプしてEnterを入力します。コマンドプロンプト状態のシェルウィンドウが出現します。

    通常のコンテキストメニューから開いた場合に表示されるDOSウィンドウです。
  • 以下のように入力します。
    cd C:\Python25
Enterを入力すると、シェルはPythonをインストールしたディレクトリに移動します。Pythonをデフォルトの場所にインストールしていない場合、自分がPythonをインストールしたパスに書き換えてください。どこにPythonがインストールされているかわからない場合、スタートメニューを開き、『プログラム(P)→Python 2.5』にあるショートカットのどれかを右クリックしてプロパティ(R)を選択します。ショートカットタブを開けば、『リンク先(T)』のテキストボックスにインストールディレクトリが書かれています。そこで手に入れたパスを、上記と同じような形式でプロンプトに入力します(訳注:場合によってはグレーアウトしてコピペできないこともあります)。
  • 次に、以下のように入力します。
python.exe Scripts\niftoaster.py optimize C:\nifoptimize
Enterを入力すると、niftoaster.pyというスクリプトがC:\nifoptimizeディレクトリとその下層ディクトリにあるNIFに対して走ります。一度に大量のNIFを最適化する場合、コンソールを眺めるよりログを出力した方が使い勝手がいいかもしれません。そうしたい場合は以下のようなコマンドを使用します。
python.exe Scripts\niftoaster.py optimize C:\nifoptimize > C:\log.txt
すると、コンソールに表示される出力がC:\log.txtに出力されます。
  • 全てが希望通りに動作した場合、警告と確認が表示されます。YキーをタイプしてEnterを入力してください。これで指定したディレクトリにある全てのNIFに対してプログラムが動作します。
  • スクリプトが解釈できないNIFに出食わした場合、エラーが表示されますが、スクリプトは動作しつづけます。問題のNIFは最適化されずに残るので、必ずNifSkopeでチェックし、崩壊したNIFをゲームで使用するはめにならないよう危険を排除してください。
  • 作業の後で全てのNIFを再確認するのも忘れないでください。NifSkopeで開いて問題なさそうであれば、きっと大丈夫だと思います。

4.2 コマンドラインオプション

最も重要なコマンドラインオプションは以下に列挙します。完全なリストは「-h」オプションを実行してください。

4.2.1 簡単なオプション

頻度の高いものはここに列挙してあるものだけで十分だと思います。

-x blocktype
blocktypeに書かれたブロックタイプを最適化から除外します。例:
python.exe Scripts\niftoaster.py -x NiTriStrips optimize C:\nifoptimize
こうすると、スクリプトはNiTriStripsブロックは最適化(重複する頂点を削除、再Strip化、再Skinningなど)しません。このオプションには複数のブロックタイプを列挙できます。
python.exe Scripts\niftoaster.py -x NiTriStrips -x NiMaterialProperty optimize C:\nifoptimize
このように記述すれば、NiTriStripsは最適化されず、NiMaterialPropertyブロックもマージされません。
-i blocktype
blocktypeに書かれたブロックタイプのみ最適化します。例:
python.exe Scripts\niftoaster.py -i NiTriStrips optimize C:\nifoptimize
このように記述すると、スクリプトはNiTriStripsブロックのみを最適化(重複する頂点を削除、再Strip化、再Skinningなど)します。このオプションには複数のブロックタイプを列挙できます。このオプションが記述されない場合、-xで除外されたもの以外の全ブロックタイプが最適化されます。
-h
全コマンドラインオプションを簡易な説明つきで表示します。

4.2.2 上級者向けのオプション

以下のオプションは主としてデバッグで使用されるものです。

-r
最適化中のエラーなど、例外が起きた場合にウィンドウをアクティブにします。本来の動作としてはエラーを吐き出すだけのシンプルなものであり、エラーとは関係なく次のファイルに進んでしまいます。エラーが起きた際に一時停止して欲しい場合はこのオプションを使用してください。デバッグ作業に有用です。
--noninteractive
最適化の前の確認画面を表示しません。通常はこのオプションを使用しないでしょうが、デバッグ作業で同じファイルを何度も最適化を実行しなくてはいけないなどといった場合に、多少時間を節約できるかもしれません。
--dry-run
最適化後、元ファイルに上書きするのではなくtemporary fileに結果を保存します。これも、デバッグ作業に有用です。
幸運を、あと楽しい最適化を!

5 FAQ

  • バグはどこに報告すればいいですか? http://sourceforge.net/tracker/?group_id=199269[外部]
  • 見た目が変わったり、欠損したりしますか? いいえ。もし最適化前後で見た目の違いがあることがわかったら、元NIFファイルと共にバグを報告してください。
  • *** TEST FAILED ON... ***とかいうエラーメッセージが出て終了しましたが、どういう意味ですか?私のNIFはもう駄目になってしまいましたか? バグとNIFファイルをセットにしてバグレポートに報告してください。おそらくあなたのNIFファイルは崩壊していません。最適化スクリプトがこのエラーを吐き出しても、元ファイルは救出できます。私の知る範囲では、この救出は失敗しないはずです。元ファイルと救出したファイルが完全に一致していなくてはならない場合、救出した後でファイル同士を比較してみてください。
  • 最適化スクリプトはKFファイルにも使えますか? 現在のバージョン(2008年9月19日)では、通常のKFにはGeometryが含まれていないので放置しています。将来のバージョンではアニメーション関係のNIFブロック、つまりはKFファイルも最適化に含まれるかもしれません。
  • 素晴らしい! 最適化スクリプトはメッシュディレクトリ全てに使用できますか? 最適化スクリプトはそういった用途には書かれていません。しかし、ユーザによってはスクリプトの使用によってFPSの著しい向上が報告されています。リスクといえば、最適化したNIFファイルそれぞれを手動でチェックすることができず、崩壊したNIFファイルが残されてしまう、ということです。まぁ、自分の責任でどうぞ。BSAに含まれる公式のメッシュを最適化してみましたが、崩壊したNIFファイルはありませんでした(*印のついているのは、大きな変化があったものです。なので、最初にやってみるといいかもしれません)。絶対にバックアップを作成してください。
    • architecture *
    • dungeons *
    • clutter
    • furniture
    • landscape
    • plants
    • rocks
  • では、最適化すべきではないメッシュはありますか? 原理的に言えば、最適化スクリプトはどんなNIFファイルでも適用できるようになる予定です。ですがもちろん、全てのNIFファイルでテストをしたわけではありませんし、最適化スクリプトが動作しない場合も、NIFを崩壊させてしまう場合もあるでしょう。最適化すべきではないNIFは以下のものです。
    • hair
    • helmets
    • いくつかのcreatures
    • いくつかのclothes
    • .egmと関連づけられているNIF

原文、画像転載元:http://cs.elderscrolls.com/constwiki/index.php/Nif_Optimization 09-06-26

Tutorials:  トラックバック(-)  コメント(-) 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。