SpriteStudio / SS5PlayerForUnity

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

v1.5.16:Script_SpriteStudio_Root.LateUpdate()の高処理負荷について #209

Open YutakaNagayama opened 6 years ago

YutakaNagayama commented 6 years ago

お世話になります。 先日SS5PlayerForUnityをv1.5.8からv1.5.16に更新したところ あるデータのみ Script_SpriteStudio_Root.LateUpdate() で高負荷がかかるという現象に遭遇しました。 過去のバージョンに遡って確認しましたがv1.5.13あたりから発生します。 (v1.5.11に関してはエラーになって動きませんでした) 該当データは再インポートした状態です。 ProfilerをみるかんじではエフェクトのUpdateに処理がかかっているので、パーティクルが多いのかな?とも思いましたが、v1.5.8では特に高負荷ではありませんでしたのでv1.5.13あたりのエフェクトに関する修正が関係しているのではないでしょうか?

お忙しいとは思いますが該当データをメールにて送付いたしますので、そちらで再現するかご確認お願い出来ないでしょうか? よろしくお願いいたします。

DKAlpha commented 6 years ago

ご報告ありがとうございます。お送りいただいたプロジェクトの方を調査したいと思います。

MasamiYitsuse commented 6 years ago

YutakaNagayama様

お世話になっております。 レポートおよび詳細なご検証と、検証用データのご提供、ありがとうございました。

いただいた症状を解消したバージョンを、当GitHubのdevelopブランチに、Ver.1.5.17としてコミット&プッシュいたしました。 お手元で状況が解消されるか、ご検証頂けますようお願い致します。


その上で、解消された症状と原因を報告させていただきます。

症状: エフェクトを使用したアニメーションを含んだSSAEファイル内にある、エフェクトを使用していないアニメーションでも、エフェクトの再生負荷がかかってしまっていました。 細かくは、 ・エフェクトが非表示の状態である ・そのアニメーションではエフェクトパーツが存在しているが、使用されていない アニメーションでも、エフェクトの再生処理が行われてしまっておりました。

原因(その他): Ver.1.5.8以前では、エフェクト及びインスタンスアニメーションは、呼出元のアニメーションとは非同期(別々のLateUpdateタイミング)で更新処理されていたため、Unityが各GameObjectを生成したタイミングによっては、再生フレームが、1処理ループ分ずれる症状がありました。

それを解消するために、子になっているアニメーション及びエフェクトについては、親のアニメーション更新タイミングで強制的に更新するように変更したのが、Ver.1.5.11(及びその安定版のVer.1.5.13)でした。

その変更を行った際に、未使用状態のエフェクトの更新を回避する判定を入れていなかったために、今回の症状が発生いたしました。

Ver.1.5.17を適用していただくと、パフォーマンスについては、Ver.1.5.8以前と同様のパフォーマンスになるはずです。


また、これは余談となりますが、Ver.1.5.8以前でデータを再生しますと、エフェクトデータを含んだアニメーションを再生開始した初回ループのみ処理負荷が生じていますが、Ver.1.5.17では毎ループ、処理負荷が生じます。 これは、Ver.1.5.8以前が エフェクトを呼び出しているアニメーションがループした際に、エフェクトの再生がおかしくなる(再生をやめてしまうもしくは再生がおかしくなる) ……という症状を抱えていたことによるもので、 Ver.1.5.17での毎ループ処理負荷が生じる(毎ループ、エフェクト再生を行う) ……のが正しい動作となります。 その旨ご理解の程お願い致します。


最後に、恐らくはご提供いただいたサンプルデータが作成途中のもの、もしくは当方検証用にパフォーマンスをわかりやすくしていただいたものであることを理解しつつ、老婆心となりますので、失礼など御座いましたらなにとぞ平にご容赦のほどお願い申し上げます。 ご提供いただいたデータで使用されているエフェクトは、最大時に5700~5800のパーティクルを発生しています(親が子を生むパーティクルのため、親×子の個数がかかり・それらが時間経過とともに累積するものがあるため、このオーダーになります)。 このオーダーはCPU処理が非常に重くなるため、特にスマートフォンや携帯機などでは相当な負荷となります。 実用上、500程度にパーティクル発生のオーダーを収めるような形が望ましいのではないかと思われます。 (SS5のエフェクトエディタ上で最大パーティクル数が確認できます)

また、SS5PUもデフォルト状態(エフェクトの再生設定で描画パーティクル数を変更しない状態)では、発生しているパーティクルのうち、先着で1024までのデータしか表示しないようになっています。 ですので、上記のデータの場合で設定を変えていない時は、4000以上のパーティクルが「計算されるが表示されない」形になっております点、ご理解頂けますと助かります。 ※この最大描画数を6000などにすれば、全てのパーティクルを描画することは可能ですが、アニメーションの初期化(基本はStart関数実行時)時にこの6000個のパーティクルの処理バッファを設置するため、その時点でのオーバーヘッドがかなりのものになることもご理解下さいますようお願い致します。


以上となります。

何卒今後とも宜しくお願い致します。

YutakaNagayama commented 6 years ago

お世話になります。 症状の確認と対策バージョンありがとうございました。

こちらで確認したところ問題なく再生できるようになりました。 パーティクルに関しては、おそらくデザイナの方で実験的に入れていたデータが残っていたものと思われます。 デザイナとも情報を共有し既存のデータおよび今後のデータ作成の目安にしたいと思います。 ご助言ありがとうございました。