SpriteStudio / SS5PlayerForUnity

OPTPiX SpriteStudio 5 Player for Unity
http://www.webtech.co.jp/spritestudio/
MIT License
39 stars 15 forks source link

v1.2.3 処理負荷対策について #109

Open M-Kanou opened 9 years ago

M-Kanou commented 9 years ago

お世話になっております。

処理負荷についてお尋ねしたい事があるのですが、 現在のSS5PlayerForUnityには、こちらのヘキサドライブさんのスライド事例のような 処理負荷軽減の対応は入っているのでしょうか? http://www.slideshare.net/webtechnologycorp/cedec2014-38952411

こちらでサンプルに含まれている「character_template_2head」のプレハブを、 画面に100体生成して動かすと、PC(Mac:CPU 3GHz Intel Core i7)上で60FPS→40FPSになっておりまして、 アニメーションするキャラクターが大量に出てくるようなゲームを 作るのが厳しい状況で、対策がないかを探しており、上記のスライドを発見しました。

お忙しいところ申し訳ありませんが、何かしらご返答いただけると助かります。

M-Kanou commented 9 years ago

申し訳ございません、最近v1.2.3にアップデートされており、 パフォーマンス優先での出力などが加わっている事を先ほど知りました。

v1.2.3のパフォーマンス優先でもう1度確認し、報告させていただきます。

Unityのバージョンは5.0.1f1です。

M-Kanou commented 9 years ago

v1.2.3にて、パフォーマンス優先でインポートし生成した「character_template_2head」のプレハブデータを 使用して100体表示(waitアニメーションを再生)を試しましたところ、同PC環境で50FPS前後に改善されているのを確認しました。

やはりまだ大量表示での60FPS動作は厳しいといった感じでしょうが、 前述のヘキサドライブさんのスライドにあるような最適化処理と同じような事が一部v1.2.3に入ったものと 考えてよいのでしょうか。

MasamiYitsuse commented 9 years ago

M-Kanou様

お世話になっております。


まず、Ver.1.2.3で(正式に)搭載されたデータの再生時高速化用オプションで行われる最適化ですが、こちらは下記のような内容になっています。

・「各アトリビュートの設定でのスプライトの形状」「及びテクスチャマッピング(UV)座標」「カラーブレンド」の事前計算 ・上記と同様に各アトリビュートで計算されるコリジョン形状の事前計算

大きくはこの2つの事前計算によるランタイム側のCPU処理の軽減となっています。

また、Ver.1.1.18以降のVer.1.1系とVer.1.2系については、以下の処置も行われております。

・再生時に内部でプライオリティ制御を行うために使用されているList系クラスのテンプレートクラスの使用への変更も行われております(非テンプレートList系機能クラスで必須となる「キャスト」にまつわる処理を省いてあります) ・アニメーション再生根幹処理部分(再生フレーム決定処理)などについても、若干の最適化が行われております。

ただし、後述の理由(SS5Player For Unityが「SpriteStudio5」のほぼ全てのアトリビュート機能に対応する……という原点仕様)から、「各個別ユーザー様の用途などに合わせた、アプリケーション専用の最適化」については行われておりません旨、予めご了承いただきたく思います。


ヘキサドライブ様のスライドの内容を確認いたしますと、シェーダの内容から類推すると「(SS「5」Player for Unityではなく)SSPlayer for Unity」もしくは「相当初期のSS5Player For Unity」かと思われますので、現状バージョンとは完全に同一ではありませんが、「SS5Player for Unity」でも、やはりピクセル(フラグメント)シェーダ内に1箇所分岐処理が入っています(SS5Player For Unityが持っている独自シェーダを最後に最適化しなおしたのはVer1.0~1.1の間の時期だったと記憶しております)。


現状ですと、SS5Player for Unityは、「SpriteStudio5で作成したデータをできる限り忠実にUnity上に再現する」ために色々な追加処理を行っている部分があり、(処理内容が必然的に複雑にならざるをえないため)いささか動作そのものは(特に大量のアニメーションオブジェクトを画面上に表示した場合などに)重いと思われる点があるかもしれません旨、ご理解の程お願い致します。

そういった側面もございまして、サードパーティのご協力・ご厚意を頂いて「(SpriteStudio3rdParty)SS5ConverterForUnity(略称「SS5C」)」というパッケージも別途公開させていただいております。 https://github.com/SpriteStudio3rdParty/Ss5ConverterForUnity2D

こちらは、SS5Player For Unity(SS5PU)と異なり、「SpriteStudio5で使用できるアトリビュート・機能に制限がある」代わりに「Unityの標準的な機能群を使用したデータに変換される」「SS5PUよりも高速に動作できる(SS5PU独自の再生・描画処理を経由せず、Unityの機能を直接使っていることから、処理が高速になるケースが少なくない)」という特性のパッケージとなっております。

また、「SS5PU」では難しかった、「NGUI」などの他描画アセットとの共存などについても「SS5C」では比較的共存が簡単になっております。

「SS5PU」と「SS5C」は、互いに干渉しない構造となっておりますため、同じプロジェクト・シーン中に「SS5PUのプレーヤー・及びインポートしたデータ」と「SS5Cでインポートしたデータ」とがあっても、機能衝突することなく双方とも使用可能です。 ※ただし、「SS5PU」と「SS5C」は格納データ構造やスクリプトからの扱い方は全く異なっておりますので、「SS5CでインポートしたデータをSS5PUの機能で再生する」というような使い方はできませんのでご注意ください。

使い分けとしては

・NGUIなどと併用する場合(主にU/Iなどのクリックパーツ群) ・1マテリアルを使用し・アトリビュート等の制限内で作成されたアニメーションオブジェクトを大量に出す場合 などについては「SS5C」を

・複雑なアトリビュート指定やインスタンス呼出・及び複数マテリアルを使用したオブジェクトを出す場合 などについては「SS5PU」を

……という一案を提示させていただくことができます。


上記となっております。 何卒今後とも宜しくお願い致します。


追記: もし、「SS5PUのみを使用して・かつ、使用していない機能の処理を削除することでの高速化」などの「アプリケーションの仕様に依存する改良」をご希望の場合、「SS5PUの処理内容をソースを見てご判断いただき・自己責任で改造(DIY)」していただきます様お願い申し上げます。

MasamiYitsuse commented 9 years ago

M-Kanou様

お世話になっております。 追加情報となりますが、Unity上のエディタ上で実行した場合ですと、(Pro版のプロファイラでCPUの処理負荷解析すると解るのですが)描画マネージャ処理の時に「マテリアルのインスペクタを書き換える」ための処理が(使用するマテリアル数などに比例して)かなりのパフォーマンスをもっていく場合がございます。 恐らくその処理は、「エディタ上でしか行われない」処理だと思われますので(SS5Playerの描画部が描画プリミティブを整理してマテリアルなどを再構築した段階で、Unityの内部処理で行われているものと思われます)、恐らくビルド後の実行状態では入らない処理だと思われます。

もしご考察頂く際の一助になればと思います。

MasamiYitsuse commented 9 years ago

M-Kanou様

お世話になっております。 追記の3となります。 一応、まだ正式リリース前ですが、本GitHubのDevelopブランチに、現在Ver.1.2.6がアップされています。 こちらは、描画速度の面は1.2.3と同様となっておりますが、細かなバグ等について1.2.3から改善されているバージョンとなっております。

もし支障などなければ、こちらのバージョンのご使用もご検討ください。

M-Kanou commented 9 years ago

非常に詳細かつご丁寧な回答をいただき、大変ありがとうございます。 諸々、承知いたしました。

頂いたご提案の中で、SS5ConverterForUnityの使用をひとまず検討させていただきたいと思います。

以上、よろしくお願いします。