SpriteStudio / SS5PlayerForCocos2d-x

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

全般 SpriteStudioで作成したデータの使用メモリ試算について #61

Open crosis1 opened 7 years ago

crosis1 commented 7 years ago

SpriteStudioで作成したデータをAndroidやiOSで使用する際、 どの程度のメモリを使用するかデータ作成前に試算したいと考えております。

試算にあたって、最も影響が大きい要素としては、使用するテクスチャと それを使用するオブジェクトの数の認識でおります。

例えば、6464のARGB8888の画像を使用してパーティクルを100個出す際 使用メモリの概算としては下記のようになると思います。 ・基本テクスチャ読み込み分:64644 = 16KB ・パーティクルオブジェクト分:64644100 = 約1.5MB 2要素を合計して約1.5MB程度の試算となると思いますが、 これ以外の要素で試算に含めるべき大きな要素は御座いますでしょうか?

試算と実際の使用メモリ量の誤差が大体1.2倍以内に収まるようになればと考えております。

また、アニメーション情報等は、キーが増えるだけ増加すると思いますが、 その増加量の試算式等の情報等は有りますでしょうか?

開発環境は下記となっております。 SS5Player For Cocos2d-x v1.3.5 Cocos2d-x 3.13.1 Android OS4.2以上 iOS 9以上

DKAlpha commented 7 years ago

ご質問ありがとうございます。 SS5PlayerForCocos2d-xで使用するメモリの大まかな内訳ですが、大きくは ・アニメーションデータが含まれるssbpファイルの常駐 ・アニメーションが使用するテクスチャのサイズ になります。

ssbpは基本的に事前に計算した各フレームの値が出力されていますが、0フレーム目の値から変化があるアトリビュートのみを書きだしていく、という圧縮方法になっています。 例えばキーが存在しても0フレーム目と同じ値の場合はデータが書き出されないのでデータが小さくなります。 ssbpファイルを常駐するのに使用するメモリ量については生成したssbpファイルのサイズを参照してください。

次に画像についてですが、「6464のARGB8888の画像を使用してパーティクルを100個出す際」の例ですと、各パーティクルは常駐している同じセルマップ(=テクスチャ)を参照しますので100枚分のテクスチャは読み込まれません。 よって6464のARGB8888の画像一枚分が読み込まれる事になります。

注意点として。1つのsspj内で同じテクスチャを参照したセルマップが複数あった場合、セルマップの分テクスチャが読み込まれます。 セルマップの参照はsspj(=ssbp)単位で共用化されますので、複数のsspjで全く同じセルマップファイルを使用していた場合でもsspj毎にテクスチャが読み込まれる事になります。

実行時に動的に確保されるメモリは大きく以下になります。 ・再生するアニメーションに含まれるパーツ数分、CustomSpriteクラスが生成されます。 ・エフェクト用スプライトクラス、createEffectBufferでアプリケーション最初に生成し常駐します。

crosis1 commented 7 years ago

ご返答ありがとうございます。

100枚分のテクスチャは読み込まれません。

この部分ですが、確かに読み込まれてメモリにのるテクスチャについては1枚かと思いますが、 それを利用するプリミティブについては100個分作成されると思っており、 その分メモリが使用される認識です。

上記メモリについては下記で確保されるバッファから使用される認識でしょうか? ・エフェクト用スプライトクラス、createEffectBufferでアプリケーション最初に生成し常駐します。

DKAlpha commented 7 years ago

>それを利用するプリミティブについては100個分作成されると思っており、その分メモリが使用される認識です。

こちらの回答ですがプレイヤーでテクスチャを表示するために ・CustomSprite::setTexture(cocos2d::Texture2D* texture)  と ・Sprite::setTextureRect

を使用しているのですがコードを見たところ特にsetTextureは_textureにアドレスをコピーするだけなので、特にテクスチャの複製はしていないんではないかと思いそのように回答いたしました。

こちらについては描画時に表示用のテクスチャを作成している可能性もございますが、cocosの内部実装によるという事になりますのでお答えしかねます。

プレイヤーの方で使用しているメモリの大きな内訳は、 ・アニメーションデータが含まれるssbpファイルの常駐 ・アニメーションが使用するテクスチャのサイズ となります。

エフェクト用のバッファについてはSpriteStudioのエフェクトパーツを表示する際のパーティクルが使用するものになります。 アニメーションは事前計算にてパーツ数が確定しますが、エフェクトパーツはパラメータを元に動的に再生するため再生するまで個数が確定しておりません。 そこでパーティクルの表示はエフェクトバッファをアプリケーション最初にある程度生成してプールしておき、表示する分だけ一時的に割り当てて使用します。 このエフェクトバッファは全プレイヤーで共用する形の実装となっております。

ご質問いただいた、「パーティクルを100個出す」が「エフェクトパーツ」によるものであれば、ご指摘の通りcreateEffectBufferでアプリケーション最初に生成したエフェクトバッファが一時的に割り当たる事になります。

crosis1 commented 7 years ago

承知致しました。 ご回答ありがとうございました。 本件解決と致します。

DKAlpha commented 7 years ago

こちらの情報は他ユーザー様へ共有させていただくためオープンとさせていただきます。 ご了承ください。