SpriteStudio / SS5PlayerForUnity

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

v1.0.0 一定の周期でガベージコレクションが発生し処理落ちする #145

Open SpriteStudio opened 8 years ago

SpriteStudio commented 8 years ago

発生バージョン

Hierarchy内に SpriteStudio のオブジェクト(Script_SpriteStudio_PartsRootがアタッチされているGameObject)を 10数体を配置した際に、約10秒に1回の周期でガベージコレクションが自動的に発生し、処理落ちする現象が発生しております。

対処方法

TakumaOkubo1985 commented 8 years ago

現在、SS5Player for Unity v1.0.0 を用いて実装がFixしていますので、v1.2.17 以降にアップデートするのが非常に困難な状況でございます。 v1.0.0 を使用したまま、ソースコード側の改修で対応できる方法をご教示頂けますと幸いです。

MasamiYitsuse commented 8 years ago

TakumaOkubo1985 様

お世話になっております。 本件につきましては、データ格納形態などから考えると、Ver.1.0.0を保ったまま解消することが非常に難しいかと思われます。 当方でも方法を検証・検討してみようとは思いますが、Ver.1.0.0ですと、プレーヤー(インポータ部含む)自体にかなりの改造が入る可能性(つまり互換性などの面も考えると、コード的にもデータ的にも到底Ver.1.0.0とは言えない状態)になる可能性が高く、ご希望に添えるかどうか非常に不明な状態です(パッチ充てなどの軽微な改造方法での解消が難しいかと思われます)。 かつ、(検証の結果、将来的に方法が見付かったとしても)返信そのものに少々お時間がかかってしまう可能性が高いかと思われます。

その旨、ご了承の程、伏してお願い申し上げます。

TakumaOkubo1985 commented 8 years ago

MasamiYitsuse 様

お世話になっております。

ご返答ありがとうございます。 Ver1.0.0を保ったまま修正が難しい件、了解致しました。

Ver1.0.0からVer1.2.17 以降のバージョンにアップデートする際に一点質問がございます。 Ver1.0.0とほぼ同じ描画形式を保つ為に、「Script_SpriteStudio_PartsRoot」がアタッチされているオブジェクト毎に、「Script_SpriteStudio_DrawManagerView」がアタッチされている親オブジェクトを作成する構造で描画した場合であっても、ガベージコレクションの問題は解消されていますでしょうか。

また、上記構造で描画した場合、Ver1.0.0と比較してCPUパフォーマンスが劣化する可能性はありますでしょうか。

以上でございます。

お手数をおかけしますが、 ご確認のほど、よろしくお願い致します。 失礼致します。

MasamiYitsuse commented 8 years ago

TakumaOkubo1985 様

お世話になっております。

CPU負荷などについては、Ver.1.0.0からVer.1.1.xへの移行時、及びVer.1.1.xからVer.1.2.xへの移行時で、描画処理に相当な変更と改良が入っているため、Ver.1.0.0よりもパフォーマンスダウンするケースは考え辛いと思われます(無論、様々な運用環境があるため、パフォーマンスダウンするケースが100%存在しないとはいいきれない部分もありますが、ほぼ大抵の場合「向上ないし横ばい」の状態になると思われます)。

ただ一点、実質的なパフォーマンスダウンの可能性が捨てきれない点があります。 「かなり大きなフレーム数でフレームスキップが入った場合」 に関して、Ver.1.1.x及び1.2.xでは「ユーザーデータのコールバックの、スキップフレーム間の検知」が厳密になっているため、大きなフレーム数をスキップした場合にデータ構造によっては、「スキップしたフレーム区間すべてに対してユーザーデータの走査・コールバックの発生」が処理されます。 (これはどちらかというと、Ver.1.0.0にフレームスキップ時のユーザーデータコールバック処理にバグがあったものの改修……というのが正しいのですが……) ※原則としてVer.1.2.xに関しては、1データあたり「スキップフレーム区間長×パーツ数」の分だけユーザーデータ検知処理が行われるため、一概に何フレーム……とは言い辛いですが、数十フレームとかのスキップ単位にならないと、パフォーマンスに顕在化することはないとは思われます。

また、ドローコール等の点については、現状当方が把握している限りにおいて、「DrawManagerVeiw + PartsRoot」の「Ver.1.0.0互換構造」で運用したとして、パフォーマンスダウンする可能性はほぼないと思われます。

ガベージコレクションに関しては、Ver.1.1.x→Ver.1.2.xの更新の際に若干のメンテナンスを入れたのと、Ver.1.2.16→Ver.1.2.17への更新の際に、ユーザーの方のご厚意で再度メンテナンスが入っており、GCの頻度は下がっていると思われます。 ※Ver.1.2.17は、現在GitHubのDevelopブランチにアップされており「1.2.x系のFix版候補」となっています(本1.2.17で発見されたバグを解消したものを1.2.x系のFixバージョンとして・1.3.x系に移行する予定であります)

また、リリース予定はまだ公示できませんが、現在開発中のVer.1.3.x(SS5.5.0対応版)では、再度内部処理構造やデータ構造を根本から見直して、CPU負荷やメモリ効率などを改良する処置を行っている最中です。 (Ver.1.0.0→Ver.1.1.x/Ver.1.1.x→Ver.1.2.xの移行時と同様に、Ver.1.2.x→Ver.1.3.xへの移行時も相当な基幹処理部の実装変更が入るため、(使用時互換性を留めるように努力はいたしますが)エディタ上のI/Fや関数などにかなり仕様変更が入るかと思われます)

もし、1.1.18以降のバージョンに変更される場合、大量のデータを自動でインポートするための「バッチインポート」機能が追加されておりますので、今後のバージョンアップ等の可能性を考えて、当該機能によるデータの再インポートの自動化などもご検討頂けますと非常に助かります。 ※Ver.1.0.0からですと、いずれにしてもデータの再インポートが必要になるため、その際にバッチインポート対応に移行してしまうことを推奨いたします。

お忙しい中お手数をおかけしてしまい、大変申し訳ございませんが、何卒宜しくお願い致します。

TakumaOkubo1985 commented 8 years ago

MasamiYitsuse 様

お世話になっております。

お忙しい中、ご返答ありがとうございます。

<データ構造によっては、「スキップしたフレーム区間すべてに対してユーザーデータの走査・コールバックの発生」 お手数をお掛けしますが、上記現象を防ぐためのデータ構造に関しまして、詳細な情報を頂けましたら幸いです。

以上でございます。 ご確認のほど、よろしくお願い致します。 失礼いたします。

MasamiYitsuse commented 8 years ago

TakumaOkubo1985様

お世話になっております。

まず既にご存知とは思いますが、ユーザーデータの役目と振る舞いについて解説させて頂きます。 ユーザーデータは、SS5のアニメーション中の各パーツデータの任意のフレームに設置することが出来る「アニメーションとは直接関係のないデータ」になります。 SS5PUはこのユーザーデータを再生中に発見すると、定義済の関数を呼び出します。 このコールバックによって「アニメーションの特定位置に再生が達した」などの、アニメーション再生外のスクリプトとの同期処理を行う仕組を構成することができます。

上記の通り、(一部の例外……インスタンスとして呼び出されているSSAEデータ中にコールバックを設置するなど……を除いて)任意のパーツの任意のフレーム位置にユーザーデータを置くことができるため、SS5PUの再生処理は「再生しているフレーム位置の全パーツに対して、ユーザーデータがあるか?」をチェックします。

その上で、フレームスキップが起きると、ユーザーデータについては 「スキップされた区間中にユーザーデータが存在し・コールバックが行われない」 状態にならないために、 「フレームスキップされた区間にも、ユーザーデータがあるか?」 をチェックします。

例を出しますと…… 「前回再生フレームが3フレーム目であり・今回再生フレームが7フレーム目」 であった場合、フレームスキップが3フレーム分ありますので、 「全パーツの4,5,6,7フレーム目にユーザーデータがあるか?」 をチェックして・ユーザーデータが存在していれば、コールバックを行います(4,5,6フレームがフレームスキップ分・7フレーム目が現在再生位置フレームです)。 ※SS5PUのVer.1.0.0とVer.1.1.xの一部バージョンでは、このフレームスキップ区間の割り出しにバグがあり、アニメーションがループしたり・状況によって、スキップした区間に含まれるユーザーデータのコールバックが行われない場合がある……というバグがありました。

その仕様に基づいて

データ構造によっては、「スキップしたフレーム区間すべてに対してユーザーデータの走査・コールバックの発生」

お手数をお掛けしますが、上記現象を防ぐためのデータ構造に関しまして、詳細な情報を頂けましたら幸いです。

を軽減する方法を紹介するのであれば、フレームスキップ自体はターゲット機の状況にもよりますので、抑制がしづらいと考えますと…… 「ユーザーデータを置くパーツを限定する」 となります。 仕様上、ユーザーデータを置くパーツは、原則SS5データの任意パーツに置くことができますが、ユーザーデータが設置されるパーツ数が増えれば増えるほど、ユーザーデータの走査にCPUパワーがかかります。

ユーザーデータを設置するパーツを限定することで、ユーザーデータの存在を走査するパーツの数が減りますので、CPU負荷を抑えることが可能です。 (ユーザーデータが存在していないパーツについては、ユーザーデータの走査処理の大半が実行されないためです)

以上となります。

お忙しい中お手数ですが、ご検討の程お願い致します。

TakumaOkubo1985 commented 8 years ago

MasamiYitsuse 様

お世話になっております。 ご返答ありがとうございます。

<フレームスキップ自体はターゲット機の状況にもよりますので、抑制がしづらいと考えますと…… <「ユーザーデータを置くパーツを限定する」 <となります。 現在、ユーザーデータを設定しているオブジェクトが相当限定されていますので、Ver1.2.17以降のバージョンに移行する算段が付きました。

本件に関しまして、詳細な対策方法を共有して頂き誠にありがとうございました。

以上でございます。 よろしくお願い致します。 失礼いたします。

DKAlpha commented 8 years ago

v1.0の対応は難しいため、対応終了としラベルを変更します。