SpriteStudio / SS5PlayerForCocos2d-x

OPTPiX SpriteStudio 5 で制作したアニメーションデータを Cocos2d-x v3 v2 上で再生するためのプログラムです。
MIT License
8 stars 7 forks source link

Ver1.1.2 プレイヤー生成時に発生する負荷を軽減する方法はありますか? #29

Open ghost opened 8 years ago

ghost commented 8 years ago

Cocos2dx3.8に対応させるため、SpriteStudio5.5に変更しましたところ、処理落ちするようになってしまいました。

以前のバージョン(2015/1頃)に比べて処理が重たくなっているのだと思いますが、ごく簡単な使い方しかしていないので(たとえば親子関係などは使っていません)、もしコメントアウト等でカットできる処理の部分があれば、ご教授願いたいです。

DKAlpha commented 8 years ago

cocos2d-x v3.8から処理落ちが発生するようになった、という事ですがプレイヤーのバージョンは変えずに負荷がかかるようになったという事であればcocos2d-xの定時処理で負荷がかかるようになったという事も考えられます。

プレイヤーで負荷のかかるアニメーションデータについてご説明いたします。 負荷のかかるポイントとしては次の2点があげられます。 ・テクスチャの切り替え 一般的に3Dの描画では表示するテクスチャが切り替わる時に負荷がかかります。 複数のテクスチャ(セルマップ)を使用したアニメーションを表示するとアニメーション内でテクスチャの切り替えが発生してしまいます。 1つのテクスチャにすべてのパーツを含める事でアニメーション内でのテクスチャ切り替えがなくなり負荷が減少します。 また複数のアニメーションを同時に表示した場合や他のスプライトを表示した場合もテクスチャ切り替えが発生するので、アニメーション以外の画像素材も1つのテクスチャにまとめると全体的に高速化する事ができます。

優先度によってテクスチャの切り替え回数が変化します。 例えば2枚のテクスチャAとBを4回表示する場合 A>B>A>B の順で表示すると切り替え回数は3回です。 A>A>B>B の順で表示すると切り替え回数は1回になります。 意図して優先度を設定する事で負荷を下げる事ができます。

・αブレンド方法を切り替える SS上ではパーツのαブレンド(ミックス、乗算、加算、減算)という設定になりますが、 加算などの描画方法を切り替えると負荷がかかります。 こちらもテクスチャと概念は同じで、例えばミックスと加算のパーツを交互の表示すると切り替えるたびに付加となります。 同じ表示方法のパーツをまとめて表示する事で負荷を下げる事ができます。

・カラーブレンド SS5のカラーブレンドは特殊な計算を行っており色の再現に時間がかかります。 負荷がかかる場面ではカラーブレンドの使用は避けた方が無難です。

ここまでが一般的な高速化のテクニックとなります。

プレイヤーの処理としてコメントアウトできる所という事ですが、プレイヤーの定時処理は使われているアトリビュートによって必要な分だけ処理を行っているので、コメントアウトによって高速化できる箇所があるかというと感じられる変化はないのではないかと思います。 プレイヤーのv1.1でエフェクトに対応しましたが、エフェクト機能を使っていない場合従来のプレイヤーとほぼ変わらない動作となります。

また親子関係についてですが、SSの概念として全てのパーツはrootパーツの子供になりますので、親子関係が組まれた状態となっており、親子関係を使用していただいても負荷は変わりませんので使用していただければと思います。

ghost commented 8 years ago

すみません。私の説明に不足があるようでした。 プレイヤーのバージョンも古いバージョンでは、cocos2dx v3.8では正常にアニメーションが再生されなかったため、プレイヤーのバージョンも最新のバージョンにしてあります。

その上で処理落ちが発生してしまったのですが、主に連続で新しいスプライトを生成する際に処理落ちしているようです。

今回説明して頂いたテクスチャ切り替え、αブレンド、カラーブレンドは使用していませんので、おそらく処理落ちに関係していないと思います。プレイヤーの方の処理を見ますと、以前のバージョンのものに比べて、CustomSpriteというスプライトを一旦生成してから処理を行っているようですので、そのために新しいスプライトを生成する際に処理落ちするようになってしまったように推測しています。

生成後の処理に関しては、今のところ処理負荷が足りているようですので、もし生成時の処理に関して、処理をカットするなど簡単な対応方法があるようでしたら、ご教授頂けますと幸いです。

あるいは、もし可能なようでしたらプレイヤーの処理の改善を検討して頂けますと幸いです。

ご丁寧に返信頂き、恐縮ですが、他の利用者の方にとっても役に立つ部分であると思いますので、何卒よろしくお願い致します。

2015年11月5日 13:00 DKAlpha notifications@github.com:

cocos2d-x v3.8から処理落ちが発生するようになった、という事ですがプレイヤーのバージョンは変えずに負荷がかかるようになったという事であればcocos2d-xの定時処理で負荷がかかるようになったという事も考えられます。

プレイヤーで負荷のかかるアニメーションデータについてご説明いたします。 負荷のかかるポイントとしては次の2点があげられます。 ・テクスチャの切り替え 一般的に3Dの描画では表示するテクスチャが切り替わる時に負荷がかかります。 複数のテクスチャ(セルマップ)を使用したアニメーションを表示するとアニメーション内でテクスチャの切り替えが発生してしまいます。 1つのテクスチャにすべてのパーツを含める事でアニメーション内でのテクスチャ切り替えがなくなり負荷が減少します。

また複数のアニメーションを同時に表示した場合や他のスプライトを表示した場合もテクスチャ切り替えが発生するので、アニメーション以外の画像素材も1つのテクスチャにまとめると全体的に高速化する事ができます。

優先度によってテクスチャの切り替え回数が変化します。 例えば2枚のテクスチャAとBを4回表示する場合 A>B>A>B の順で表示すると切り替え回数は3回です。 A>A>B>B の順で表示すると切り替え回数は1回になります。 意図して優先度を設定する事で負荷を下げる事ができます。

・αブレンド方法を切り替える SS上ではパーツのαブレンド(ミックス、乗算、加算、減算)という設定になりますが、 加算などの描画方法を切り替えると負荷がかかります。 こちらもテクスチャと概念は同じで、例えばミックスと加算のパーツを交互の表示すると切り替えるたびに付加となります。 同じ表示方法のパーツをまとめて表示する事で負荷を下げる事ができます。

・カラーブレンド SS5のカラーブレンドは特殊な計算を行っており色の再現に時間がかかります。 負荷がかかる場面ではカラーブレンドの使用は避けた方が無難です。

ここまでが一般的な高速化のテクニックとなります。

— Reply to this email directly or view it on GitHub https://github.com/SpriteStudio/SS5PlayerForCocos2d-x/issues/29#issuecomment-153949299 .

DKAlpha commented 8 years ago

プレイヤークラスの生成時に負荷がかかるという事で情報ありがとうございます。 SS5.5から搭載されたエフェクトを表示するためのスライトの生成に時間がかかっているようだという事で、こちらの対応をおこなったv1.1.3予定のプレイヤーをdevelopブランチにコミットしました。 こちらを取得していただき、以下の部分を変更して動作を確認してみてください。

エフェクトを使用しない場合、SS5Player.hに定義されている EFFECTSPRTE_MAX 定数を0にする事でエフェクト用のスプライトを生成しないようになりますので、プレイヤー生成時の負荷が軽減されるのではないかと思います。

ghost commented 8 years ago

developブランチのプレイヤーに差し替え、 EFFECTSPRTE_MAX定数を0にすることで、スプライト生成時も処理落ちがしないようになりました。素早い対応に感謝いたします。ありがとうございました!

2015年11月6日 14:28 DKAlpha notifications@github.com:

プレイヤークラスの生成時に負荷がかかるという事で情報ありがとうございます。

SS5.5から搭載されたエフェクトを表示するためのスライトの生成に時間がかかっているようだという事で、こちらの対応をおこなったv1.1.3予定のプレイヤーをdevelopブランチにコミットしました。 こちらを取得していただき、以下の部分を変更して動作を確認してみてください。

エフェクトを使用しない場合、SS5Player.hに定義されている EFFECTSPRTE_MAX 定数を0にする事でエフェクト用のスプライトを生成しないようになりますので、プレイヤー生成時の負荷が軽減されるのではないかと思います。

— Reply to this email directly or view it on GitHub https://github.com/SpriteStudio/SS5PlayerForCocos2d-x/issues/29#issuecomment-154290437 .

DKAlpha commented 8 years ago

解決されたようでよかったです。今後ともSpriteStuduioをよろしくお願いいたします。 今回の変更をmasterに反映いたしました。 タイトルの方を生成時の負荷についてという形に変更させていただきました。ご了承ください。

DKAlpha commented 8 years ago

v1.1.4にてSS5Manegerクラスを追加いたしました。 こちらのクラスがエフェクト用バッファを管理する事で、バッファの生成タイミングをプレイヤーの生成と別にする事が可能となりました。 またエフェクトバッファをすべてのプレイヤーで共用しますので、プレイヤー毎のバッファ作成がなくなりシーンの初期化でプレイヤーを作成した場合の負荷が大幅にへりました。 使用方法はサンプルを参照してください。 https://github.com/SpriteStudio/SS5PlayerForCocos2d-x/blob/master/samples/cocos2d-x/effect/Classes/HelloWorldScene.cpp