2011年3月19日土曜日

Freestyle統合版のレンダリング高速化について

Freestyle統合版が更新されて、ビューマップの構築に関して大規模な改善がおこなわれ
レンダリングが大幅に高速になった模様。

公式ブログにこれに関する記事があったので冒頭をざっくり訳してみました。

以下から。


ビューマップの構築はFreestyleのレンダリングプロセスで最も時間がかかる工程です。
実例として規模が大きなシーンになると考えられないほど処理が遅くなってしまいます。
開発の人手やリソースが十分ではないため、全てのToDoの項目が完了し、頓挫していた
トランクへのマージが完了した後で、この問題の解決にとりかかろうとしていました。

しかし昨年12月に我々Freestyle統合に関わる開発者たちのもとにAlexander Beels氏に
よって大規模なコードが提供されました。彼が提供してくれたのは、まさに先ほど述べた
ビューマップ構築の最適化を実現したコードでした。彼はビューマップ構築のプロセスに
おけるパフォーマンスのボトルネックを特定し、内部のデータ処理を注意深く再設計して
最適化を施していました。

12月の最初のバージョンを足がかりに、プロジェクト開発チームと協力してAlexander氏に
よるパッチに対してコードレビューとテストがくり返し行われました。彼は複数の異なる
最適化の方法の模索と実装に多大な貢献をしてくれました。3ヶ月の間ひたすらテストと実装を
行い、それは非常に効率のよいビューマップ構築のコードとして結果が実ることになりました。

このコードはFreestyle統合版ブランチのリビジョン35525として採用されています。
以下にいくつかテストシーンでのレンダ結果を載せていますが、この最適化コードにより
驚くべきパフォーマンスの改善が行われていることがおわかりいただけるかと思います。

Alexander氏のすばらしい成果にこころからの感謝を!


ここまで。

という感じ。
元記事には上記の概要に続いて技術的な面からの解説やオプションの説明、テスト結果などが
記載されています。ここでは実際に使用する上で知っておくとよさそうな内容を中心にメモ。


今回のパフォーマンスの向上はFreestyleによるレンダリング処理の中でビューマップ構築に
関する部分に対して行われた最適化による結果。具体的には、ビューマップ構築のなかでも
『シルエットエッジの検出』と『エッジの視認性の計算』の部分で改善が行われたとのこと。

で、これらの改善、特に『エッジの視認性の計算』のアルゴリズムに関わるオプションとして、
Freestyleの設定に"Raycasting Algorith"というオプションが新しく追加されました。



このオプションでエッジの視認性計算に関わるアルゴリズムを以下の7つから選択可能に。

・Normal Ray Casting
・Fast Ray Casting
・Very Fast Ray Casting
・Culled Traditional Visibility Detection
・Unculled Traditional Visibility Detection
・Culled Cumulative Visibility Detection
・Unculled Cumulative Visibility Detection

最初の3つはオリジナル(おそらく統合以前のスタンドアロン版)のFreestyleで利用可能だった
ものと同様のアルゴリズムとのこと。"Normal …"がデフォルト、"Fast …"と"Very Fast …"は
正確さと引き換えにエッジの視認性の計算においてより高速な処理を実現するものです。

それ以下の4つが今回の最適化で導入された新しいオプション。
おすすめは"culled cumulative …"か"unculled cumulative …"で、将来的にはこの2つが
メインのオプションとして残る予定らしい。

じゃあ、"… Traditional …"って何なのか?とか、"Culled …"と"Unculled …"の違いは?と
気になったので調べてみたら以下のような感じ。


・"Traditional"と"Cumulative"の違い

今回エッジの視認性計算のアルゴリズムに関して手が加えられたことで、改善されエッジの
視認性に関してより安定した値を算出するようになった新しいオプションが"Cumulative"。
ただし、当然これは従来のものとは別のアルゴリズムなので、同様のシーンをレンダしても
従来と結果が異なる可能性がある。そのため最適化を行いつつ従来のアルゴリズムと同様の
結果がでるようにエミュレーションしたものが"Traditional"。


・"Culled"と"Unculled"の違い

culledとunculledの違いはカメラに写る領域に対してcullingを行うか否か、という点。
culledはカメラの視角外の領域(つまりレンダリングする必要のないエリア)を処理に含めずに
エッジの視認性の計算を行う。これにより処理速度は向上するけれど、除外されたエリアとの
関連性によってはレンダ結果においてエッジの連続性に影響がでる可能性があるとのこと。
unculledはシーンに存在するデータすべてを対象としてエッジの視認性の計算を行うもの。
なので、直接はカメラに映らないけどエッジの連続性に影響を与えるようなオブジェクトが
シーンに存在する場合などにはこちらの方がよさげ。


以上のTraditionalとCumulative、CulledとUnculledの組み合わせで新しいオプションは4通り。
で、ざっと見た感じCumulativeの方が良さそうで、場合によりCulledとUnculledを使い分ける
感じかなーとなるので、おすすめは先ほどの2つということらしい。


最後に、従来と比較してどれくらい高速なのかという部分。

いままで単純なシーン、オブジェクトだとFreestyleによるエッジ描画の有無であまり違いは
無いけれど、シーンが複雑になるにつれ急激にエッジ描画の部分に時間がかかってくる感が
ありました。

今回の最適化の結果としてその辺が改善されたのか、複雑で規模の大きなシーンほど従来と
比較して、処理時間の削減率が高いという数字がでているようです。シーンが大きく複雑に
なるに従って、今までの十分の一、百分の一という感じ。

詳しくは元記事の下の方に記載されている表を参照のこと。



---------------------------------------------------------------

コメントなどありましたらこちらへ->web拍手