SpriteStudio / SS5PlayerForCocos2d-x

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

v1.3.1 プレイヤー解放時にメモリエラー #52

Open masa-wg opened 8 years ago

masa-wg commented 8 years ago

お世話になっております。 現在、SS5PlayerForCocos2d-x を用いてAndroid向けのアプリを開発しております。 特定のアニメーション再生後、解放すると、100%停止する状態になってしまいました。 この現象についてアドバイスをお伺いしたく、投稿させて頂きました。

▼開発環境 cocos2d-x-3.10
SS5PlayerForCocos2d-x

▼プログラムコード   player = ss::Player::create(); player->setData("ef_filename"); // ssbpファイル名 player->play("ef_ssaename/animename"); // アニメーション名を指定(ssae名/アニメーション) player->setPosition(0, 0 ); mainnode->addChild( player );

---------
その後、
player->removeFromParent(); 

 を実施すると、他のアニメーションデータは問題ないのですが、特定のアニメーションのみ100%停止してしまいます。

▼エラーログ A/libc: @@@ ABORTING: LIBC: HEAP MEMORY CORRUPTION IN dlfree ・・・中略 I/DEBUG: ffff0000-ffff1000 [vectors] I/DEBUG: !@dumpstate -k -t -z -d -o /data/log/dumpstate_app_native -m 25837   ▼その他の調査  ・上記アニメーションデータの再生自体は問題なく動作  ・同じ制御のままアニメーションデータを他のデータに切り替え     → 数種類試しましたが同様の症状は見られず    → 通常の解放手順には問題なさそうと認識しております。  ・アニメーションを解放せず、無限ループさせて放置 → 問題なく動作  ・現象は上記ファイルに限定  ・>removeFromParent のコールタイミングを変える → 症状変化せず

▼現象に関しまして ・注意点(確認点)はどの様なものがあるでしょうか? ・該当アニメーションデータの送付が可能です。 一度データファイルを見て頂く事は可能でしょうか?

宜しくお願いいたします。

DKAlpha commented 8 years ago

ご報告ありがとうございます。 気になる点がありましたのでご質問させていただきます。

特定のアニメーション再生後、解放すると、という事ですが、解放とは何を意味しますでしょうか? ・読み込んでいるssbpファイル、関連画像をメモリから消したい ・シーンの子供になっているSS5Playerをシーンから削除したい (使用したリソースは常駐したままでアニメーションの表示をやめたい) おそらくどちらかの事だと思いますが、目的によって操作が変わりますのでこの点ご回答いただきまして、送っていただいたアニメーションデータの方を調査したいと思います。

masa-wg commented 8 years ago

早速のコメント有難うございます。 目的は後者、シーンの子供になっているSS5Playerをシーンから削除(リソースは常駐したまま)です。 どうぞ宜しくお願い致します。

DKAlpha commented 8 years ago

終了手順を記載します。 シーンで使用しているSS5Playerを削除はremoveChildを使用します。 ssbpファイルの解放はremoveDataを使用します。 プレイヤーがアニメーションを再生している時にssbpを解放してしまうとアクセス違反が起きてしまいますので、シーンのアップデートでssbpを解放する場合は以下の様になるかと思います。

//プレイヤーの削除 removeChild(ssplayer,true); //リソースマネージャの作成 auto resman = ss::ResourceManager::getInstance(); //ssbpファイルの削除 resman->removeData("character_template1");

通常シーンが遷移するとシーンのデストラクタで子供になっているプレイヤーが解放されるので、removeChildを呼び必要はありませんはが、ssplayerがアニメーションを行っていた場合にssbpを参照できなくなるので解放しています。

masa-wg commented 8 years ago

アドバイス有難うございます。 一つ確認させて頂ければと思います。 removeCiled(ssplayer,true)と、 ssplayer->removeFromParent()では 内部的には同じ動作をすると思われますが、 ssplayerの解放において二つの違いはあるでしょうか?

DKAlpha commented 8 years ago

cocosの方の実装を把握していないので、2つの差異はわかりませんが、removeCiledで解放するという事でプレイヤー内部やテストシーンを作成していましたので、removeFromParentを使用していなかったというのがremoveCiledを紹介した理由となります。 内部実装が同じという事であればどちらを使用していただいてもよいんだと思います。

報告でもう一点気になった部分があるのですが、 ・同じ制御のままアニメーションデータを他のデータに切り替え というのはどういった事になりますでしょうか? 同じプレイヤーを使用して別のアニメーションを再生したい、という事であれば解放は行わず //同じssbpを使用する場合は不要 ssplayer->setData("ssbp名"); //アニメーションの再生 ssplayer->play("アニメーション名"); でアニメーションの切り替えが可能となります。

masa-wg commented 8 years ago

回答有難うございます。 まずはremiveChiledで試してみます。

「同じ制御のまま切り替え」とは、 ssplayerに他のアニメを再生するようにファイル名を書き換え、再コンパイルした、という意味です。 誤解を生む表現で失礼致しました。

まずはご教授頂いた方式で動作を試してみます。

DKAlpha commented 8 years ago

remiveChiledやremoveFromParentでプレイヤーを解放したポインタssplayerにアクセスする(例えば再生フレームを取得したり等を行う)とアニメーションが参照できない状態となっておりアクセス違反が発生しますので、その点もご確認いただければと思います。

masa-wg commented 8 years ago

承知致しました。 解放後はポインタssplayerにNULLを充ててガードしておりますので、検証においても留意致します。

ご報告したアニメーションをremoveFromPalent()でシーンから切り離した時は、内部的にすべてremoveされていない様子で、アクセス違反が発生している様な挙動でした。 removeChildで動作が安定するか確認いたします。

DKAlpha commented 8 years ago

cocos側の実装を確認しましたがremoveFromParentからremiveChiledを呼び出しているので、恐らく現象が発生すると思います。 関係があるか不明ですが、先ほど案内したアニメーションの切り替えでカラーブレンドを使用したアニメーション(送っていただいたもの)に切り替えるとdrawでおちる現象を確認しました。 プレイヤーの解放に関連しているかもしれません。 SS5Player.h に含まれる #define OLDSHADER_USE 0 を1にしてプレイヤーの削除も試していただけますでしょうか? お手数ですがよろしくお願いします。

masa-wg commented 8 years ago

ご連絡有難うございます。 承知致しました。該当定義も変更して試してみます。

DKAlpha commented 8 years ago

こちらで動作を確認したテストコードをお送りしますので、現象が発生するか確認いただいてもよろしいでしょうか? 別件で問題になったカラーブレンドを使用するアニメに切り替えると例外が発生するが対応されたプレイヤーが含まれています。 プレイヤーはdevelopブランチに1.3.2としてコミットされています。

masa-wg commented 8 years ago

ご提供有難うございます。 ブランチのコードを確認しました。 早速こちらを適用しての動作も確認させて頂きます。

masa-wg commented 8 years ago

お忙しい所ご対応ありがとうございます。 それぞれ、動作検証の結果をご報告させて頂きます。

①v1.3.1 シーンからの切り離しにremiveChiledを使用 → 同様の不具合発生  ②v1.3.1 #define OLDSHADER_USE 0を1に → 症状改善しました。 ③v1.3.2 developブランチを使用(#define OLDSHADER_USE は0のまま) → 同様の不具合発生    ④v1.3.2 developブランチを使用(#define OLDSHADER_USE を1に) → 症状改善しました。

どちらもOLDSHADER_USEを1にした状態で、不具合の発生が無くなりました。 今まで正常であった他のアニメーション、及び他制御も正常に動作しておりますので、 当面はこの回避方法(④+#define OLDSHADER_USE を1)で開発を進めさせて頂こうと考えております。

※カスタムシェーダーをCocosV3系のコマンドリストに登録する新方式には、  何かしらの不具合、または他の処理系統によって問題が生じる可能性が残っていると思われます。  取り急ぎご報告まで。   

DKAlpha commented 8 years ago

報告ありがとうございます。 ひとまず回避する事ができて安心しております。 ご報告いただいた内容と別件でのアニメーション切り替えの問題の報告を考慮しまして、v1.3.2ではカラーブレンドの処理を旧バージョンの物に戻しておこうと思います。

追加でご質問いただいたSpriteStudioと表示のされかたが違う問題については、こちらを参照してください。 ・全般 パーツのαブレンド方法をミックス以外に設定して、カラーブレンドアトリビュートを使用すると結果がSS5と異なります。 https://github.com/SpriteStudio/SS5PlayerForCocos2d-x/issues/12

よろしくお願いいたします。

masa-wg commented 8 years ago

ご確認有難うございます。 ブレンド方法の設定に関しまして承知致しました。 現在のデータを確認致します。

masa-wg commented 8 years ago

お世話になっております。 カラーブレンドのアトリビュートをミックスき設定する事でSS5と見た目が一致致しました。 アドバイス有難うございました。

このカラーブレンドで御座いますが、今後、ミックス以外の設定(加算、乗算など)をサポートされるご予定はあるでしょうか?

御社のSS5及びSS5Playerは非常に素晴らしいシステムですので、私達デベロッパにとってコンテンツ作成においては有用であり、今後も継続使用をさせて頂きたいと考えております。 カラーブレンドにて加算・乗算設定が有効ですと、キャラクタアニメーション以外のエフェクトなども全てSS5で作成が可能となりますので、是非対応をご検討頂ければ幸いです。

どうぞ宜しくお願い致します。

DKAlpha commented 8 years ago

カラーブレンドについて別Issueとして回答させていただきます。 こちらをご参照ください。 https://github.com/SpriteStudio/SS5PlayerForCocos2d-x/issues/53

DKAlpha commented 8 years ago

追加情報として、こちらでご報告いただきました内容 https://github.com/SpriteStudio/SS5PlayerForCocos2d-x/issues/54 によってcocos2d-x ver3系に合わせた処理で問題が解決するかもしれません。 解決済の問い合わせではございますが共有させていただきます。