SpriteStudio / SS6PlayerForUnity

OPTPiX SpriteStudio 6 Player for Unity http://www.webtech.co.jp/spritestudio/
MIT License
21 stars 8 forks source link

[v1.1.5]Script_SpriteStudio6_ColliderのOnTriggerStayで毎フレームAllocが発生する #69

Open yutaka-sakai opened 5 years ago

yutaka-sakai commented 5 years ago

Script_SpriteStudio6_ColliderのOnTriggerStayで毎フレームAllocが発生してしまいます。

2019-06-10_19h28_06

該当のコードは下記の箇所となります。 https://github.com/SpriteStudio/SS6PlayerForUnity/blob/master/Assets/SpriteStudio6/Script/Script_SpriteStudio6_Collider.cs#L72

内容としてはObject.nameでgetterアクセスを行うと内部的にAllocが発生するようです。

UnityのForumで該当の内容が議論されています。 https://forum.unity.com/threads/request-gc-free-gameobject-name-api.517378/

該当コードを下記のコードに置き換えることでAllocの発生を抑えられることを確認していますがこちら問題ないでしょうか? InstanceRoot.FunctionColliderStay(InstanceRoot, InstanceRoot.DataAnimation.TableParts[IDParts].Name, IDParts, InstanceCollider, pair);

問題がなければ同様のコードが散見されるのでそちらも置き換えてて問題ないでしょうか・

MasamiYitsuse commented 5 years ago

yutaka-sakai 様

お世話になっております。 症状と回避方法及びフォーラムの情報ありがとうございます。 非常に丁寧にご報告いただき御礼申し上げます。

さて、ご指摘いただいた方法で、ほぼ問題ありません。 ただその場合、コライダがついているパーツのIDPartsが0の時(ルートパーツ)の時のみ、GameObjectの名前ではなく「root」という名前がdelegate処理関数に渡ることになるんじゃないかと(今ソースを見ていて)思った次第で……。 そのシチュエーションがお手元で問題にならないのであれば、書き換えても動作に問題はありません(し、GCの問題もクリアできると思います)。

※ルートに当たり判定をつけて「接触したアニメーションのインスタンス名」を判定するシチュエーションは結構ありえるのかも??……と思っていたりするのが、即答を避けて検討したい点ではあります。

ですので、こちらの問題については、実際にSS6Player for Unityのバージョンを上げるための改修をどう行うかについて、検証のお時間をいただきたくお願いいたします(ありていに言いますと、「ちょっとだけお時間ください」となります)。 ※非常に内々な事情で申し訳ありませんが、現在SpriteStudio6.3への対応確認などで手間が取られている近々の状況ですので、それが終わり次第、できる限り早く検討と処置を行いたいと思っております。

本件については、これにまつわる改修を行い、対処が終了した段階で、本Issueに返信(及び改修版をGitHubにコミット)する形でお知らせさせていただきたくお願いいたします。

大変申し訳ございませんが、何卒ご理解の程お願い申し上げます。 また、重ねて、詳細で丁寧なご連絡をいただき、心から感謝しております。

何卒今後ともよろしくお願いいたします。


追伸: お知らせいただいたバージョンは1.1.5でいただいておりますが、もし問題がなければ、1.1.9に対して対処を行おうと思っております。 もし、1.1.9でご都合が悪い場合(#68の件などありますので)などございましたら、(1.1.9に対して行った)詳細な対応内容をこちらでお知らせすることも可能ですので、その場合はご一報ください。

yutaka-sakai commented 5 years ago

ご対応ありがとうございます。

現状まだ検証段階であり、今すぐ必要というものではないので、手元では一旦コードを書き換えて対応し、アップデートを待つ形にしたいと思います。

また、上述の通りまだ検証段階ですので、1.1.9での対応で問題ありません。

お手数をおかけいたしますが、引き続きよろしくお願い致します。

MasamiYitsuse commented 5 years ago

yutaka-sakai 様

お世話になっております。 お待たせいたしました。

上記対応したバージョンをVer.1.1.19としてdevelop及びsampledevelopブランチにコミットいたしました。

ただ、動作やデリゲート型に変更が入っているため、お手元のソースの修正が必要になるかと思われます点、お手数をおかけしてしまい申し訳ありません。

詳細は #74 に記載してあります(後にWiki上のマニュアルも改稿する予定です)。

何卒今後ともよろしくお願いいたします。

yutaka-sakai commented 5 years ago

ご対応ありがとうございます。 少々立て込んでおりましてまだ確認が取れておりませんが、落ち着き次第確認しご報告させて頂きます。

尚、これまでSpriteStudio側でOnCollisionは使用していなかったので確認はとれておりませんが、https://github.com/SpriteStudio/SS6PlayerForUnity/issues/74 にあるFunctionCallBackCollisionのAPIもGCAllocが発生してしまうのでは、という懸念があります。 恐らくではあるのですが、OnCollisionでCollisionにアクセスした際にGameObject.nameと同じくUnmanagedからManagedへのコピーが発生し、Allocが発生してしまっているのだと思います。

Unity側でも問題点は把握しており、最近になって対応が入っています。 https://blogs.unity3d.com/2018/11/12/physics-changes-in-unity-2018-3-beta/ こちらの「Obtaining contacts without garbage」というチャプターに該当の件が記載されています。