Wata

一度メールでSpineのサポートへ送った質問なのですが、次からフォーラムへ投稿するように勧められました。

---
Spineの再生部分でビルドしたアプリが落ちる問題が発生しています。

  • Spineアニメーションが複数再生・削除されるゲーム部分を2分ほど再生すると落ちます。
  • Unity Cloud Buildしたアプリのみ、iOS・Android両方落ちます。複数端末・OSバージョンで確認しています。
  • UnityからXCodeやAndroidプロジェクトを生成して、直接ビルドすると落ちません。
  • SkeletonGraphic.cs の ApplyAnimation () 内、state.Apply(skeleton); 周辺(L282-285)をコメントアウトすると、落ちません。
  • Exception Type は EXC_BAD_ACCESS(SIGSEGV) です。
  • 使っているSpineのバージョンは 3.8.xx (2019.4) でしたが、最新パッケージ(spine-unity-3.8-2021-02-11)にしても落ちました。
  • Unityバージョンは2019.4.6f1です。
  • Unityにてプロファイラーを確認しましたが、特に気になる動きを見つけられていません。[/list]

何が悪いのか、どう修正すればいいのかよくわからず、困っています。
できれば Unity Cloud Build を使いたいのですが、どうすればいいでしょうか?

---

Spineから頂いた返信は以下です。

こんにちは、

お問い合わせいただきありがとうございます。今後の質問をSpineフォーラムに投稿していただけませんか。
http://www.esotericsoftware.com/forum/
このようにして、他の人がディスカッションに参加し、回答から利益を得ることができます。心配しないでください、私たちはフォーラムの投稿に非常に迅速に答える傾向があります!ありがとうございました!

あなたの質問について:
「Spineバージョン2020.2」の使用についておっしゃいました。 Spineバージョン2020.2はなく、最新のSpine非ベータバージョンは3.8.99、最新のベータバージョンは4.0.54-betaです。
それとも、2020年2月からスパインユニティパッケージを使用しているということですか?ここで、バージョン番号には完全な日付が含まれています。 spine-unity-3.8-2021-02-17.unitypackage

>例外タイプはEXC_BAD_ACCESS(SIGSEGV)です。

ビルドされた実行可能ファイルがSIGSEGVを生成できる場合、Unityのビルドパイプラインまたはクラウドビルドインフラストラクチャのいずれかが壊れているように見えます。 spine-unityおよびspine-cppランタイムのコードは、「安全でない」拡張子のないcsharpを使用するため、それ自体でSIGSEGVを生成することはできません。

あなたが言及したコード行から、イベントコールバックが発生します。おそらく、イベントコールバックデリゲートの一部に登録していますか?どのデリゲートにも登録しないようにして、それでもクラッシュするかどうかを確認することができます。そうでない場合は、コールバックメソッドのコードがSIGSEGVを引き起こします。

SkeletonGraphic.cs:307の282〜285行目ではなく、 UpdateMesh();をコメントアウトすることもできます。これもクラッシュする場合、問題はメッシュの更新に関連している可能性があり、三角形が前のフレームと同じである場合は何もしません。したがって、上記の行282-285を無効にすると、行578を呼び出さないという効果があります。
if(updateTriangles)meshGenerator.FillTriangles(mesh);

コードに何も見つからない場合は、Unityのサポートチームに連絡して、ビルドパイプラインがクラウドビルドでSIGSEGVを引き起こしていることを報告する必要があります。

乾杯、
ハラルド
-----
Hello,

Thanks for contacting us. Would you mind posting future question on the Spine forum, please?
http://www.esotericsoftware.com/forum/
This way others can join the discussion and benefit from the answers. Don't worry, we tend to answer forum posts quite quickly! Thank you!

Regarding your question:
You mentioned using "Spine version 2020.2". There is no Spine version 2020.2, the latest Spine non-beta version is 3.8.99, the latest beta version is 4.0.54-beta.
Or did you mean you are using a spine-unity package from February 2020? Here the version numbers include the full date, e.g. spine-unity-3.8-2021-02-17.unitypackage.

> Exception Type は EXC_BAD_ACCESS(SIGSEGV) です。

If the built executable is able to produce a SIGSEGV, it seems as if either Unity's build pipeline or their cloud build infrastructure is broken. The code in the spine-unity and spine-cpp runtimes uses csharp without any unsafe extensions, so it cannot produce a SIGSEGV on its own.

From the lines of code that you mentioned, event callbacks will be raised. Are you perhaps registering to some of the event callback delegates? You could have a try not registering to any delegate, and see if it still crashes. If not, then it would be the code in your callback method that causes the SIGSEGV.

You could also try if commenting out UpdateMesh(); in SkeletonGraphic.cs:307 instead of lines 282-285. If this crashes as well, the problem would be related to updating the mesh, which does nothing if the triangles are the same as in the previous frame. So disabling lines 282-285 above would have the effect of not calling line 578:
if (updateTriangles) meshGenerator.FillTriangles(mesh);

If you don't find anything in your code, I'm afraid you will have to contact Unity's support team and report that their build pipeline causes a SIGSEGV on cloud build.

Cheers,
Harald

---

この返信を受け、現在のこちらの現状はこちらです。

  • イベント登録しているところがあったので、コメントアウトしましたが、変わらずcrashしました。
  • SkeletonGraphic.cs:307のUpdateMesh(); を L282-285 の代わりにコメントアウトしたところ、crashしました。
  • 念の為 L578 の if (updateTriangles) meshGenerator.FillTriangles(mesh);だけコメントアウトしてみましたが、crashしました。

現状 L282-285をコメントアウトしない限りcrashするようです。
自分のコード内に原因が無さそうなので、Unityにも相談をします。
なにか他にできることがあれば教えてもらいたいです。
Wata
  • Сообщения: 3

Harald

私たちに戻ってきて、さまざまな行をコメントしてみてくれてありがとう。 これらは貴重な洞察です。

L282-285の代わりにこの行をここにコメントアウトして、もう1つ試してみてください。
AnimationState.cs:
queue.Drain();
を含む299。

それでもクラッシュする場合は、実行中のゲームにVisual Studioデバッガーをアタッチしてみてください(「デバッグ-プロセスにアタッチ」、通常はCTRL + ALT + P)。その後、SIGSEGVが発生する場所に関する詳細情報を受け取ることができます。

もう1つ確認する必要があるのは、すべてのアセットが現在の状態でリポジトリにコミットされているかどうか、クラウドビルドのビルドオプションがまったく同じかどうか(w32ビルドとx64ビルド)です。
-----
Thank you for getting back to us and for trying out commenting out different lines. These are valuable insights.

Could you perhaps try one more thing, commenting out this line here instead of L282-285:
AnimationState.cs: 299 containing queue.Drain();.

If it still crashes, you could try attaching the Visual Studio Debugger to your running game ("Debug - Attach to Process", typically CTRL+ALT+P), then perhaps you receive a bit more information about where the SIGSEGV occurs.

One more thing to check would be whether all assets are committed to the repository in the current state, whether build options on cloud build are exactly the same (w32 vs. x64 build).
Аватара пользователя
Harald

Harri
  • Сообщения: 2778

Wata

Thanks for the reply.
I commented out queue.Drain();, but it still crashed.
I tried attaching Visual Studio for Mac to the Unity Debugger Process, but it didn't log properly.
In the build options, the Compression setting was different, but even with the same setting, it still crashed.
A colleague of mine had the same problem with the Unity Editor, so he gave me the Unity crash log. This crash may have been caused by something else, but the following Exception was generated.
StackOverflowException: The requested operation caused a stack overflow.
CurveTimeline.GetCurvePercent (System.Int32 frameIndex, System.Single percent) [0x00001] in C:\fnCompleted Assets\Spine\Runtime\spine-csharp\Animation.cs:291
RotateTimeline.Apply (Spine.Skeleton skeleton, System.Single lastTime, System.Single time, Spine.ExposedList`1[T] firedEvents, Single alpha, Spine.MixBlend blend, Spine.MixDirection direction) [0x00177] in C:\ Users\ medor\Documents\plum-client\Assets\Spine\ Runtime\spine-csharp\Animation.cs:390
ApplyRotateTimeline (Spine.RotateTimeline timeline, Spine.Skeleton skeleton, System.Single time, System.Single Single time, System.Single alpha, Spine.MixBlend blend, System.Single[] timelinesRotation, System.Int32 i, System.Boolean firstFrame) [0x00022] in C:\ Users\ medor\ Documents\plum-client\Assets\Spine\Runtime\spine-csharp\AnimationState.cs:431
ApplyMixingFrom (Spine.TrackEntry to, Spine.Skeleton skeleton, Spine.MixBlend blend) [0x00260] in C:\blur Documents\plum-client\Assets\Spine\Runtime\spine-csharp\AnimationState.cs:369
-As for the above Unity Editor crash, they have tried multiple times and confirmed it twice.

---

返信ありがとうございます。
・queue.Drain(); をコメントアウトしましたがやはりcrashしました。
・Visual Studio for Macを Unity Debugger Processにアタッチしましたが、うまくログが取れませんでした。
・ビルドオプションは、Compressionの設定が違っていましたが、設定を同じにしてもcrashしました。
・社内の同僚が、Unity Editorで同じような症状が出たということで、Unityの crash logをもらいました。こちらのcrashは別の原因の可能性もありますが、以下のExceptionが発生していました。
StackOverflowException: The requested operation caused a stack overflow.
at Spine.CurveTimeline.GetCurvePercent (System.Int32 frameIndex, System.Single percent) [0x00001] in C:\Users\medor\Documents\plum-client\Assets\Spine\Runtime\spine-csharp\Animation.cs:291
at Spine.RotateTimeline.Apply (Spine.Skeleton skeleton, System.Single lastTime, System.Single time, Spine.ExposedList`1[T] firedEvents, System.Single alpha, Spine.MixBlend blend, Spine.MixDirection direction) [0x00177] in C:\Users\medor\Documents\plum-client\Assets\Spine\Runtime\spine-csharp\Animation.cs:390
at Spine.AnimationState.ApplyRotateTimeline (Spine.RotateTimeline timeline, Spine.Skeleton skeleton, System.Single time, System.Single alpha, Spine.MixBlend blend, System.Single[] timelinesRotation, System.Int32 i, System.Boolean firstFrame) [0x00022] in C:\Users\medor\Documents\plum-client\Assets\Spine\Runtime\spine-csharp\AnimationState.cs:431
at Spine.AnimationState.ApplyMixingFrom (Spine.TrackEntry to, Spine.Skeleton skeleton, Spine.MixBlend blend) [0x00260] in C:\Users\medor\Documents\plum-client\Assets\Spine\Runtime\spine-csharp\AnimationState.cs:369
・上記Unity Editorのcrashに関しては、複数回試して2回確認したとのことです。
Wata
  • Сообщения: 3

Harald

私たちに戻ってきて、追加情報をありがとう。
Wata писал(а):社内の同僚が、Unity Editorで同じような症状が出たということで、Unityの crash logをもらいました。こちらのcrashは別の原因の可能性もありますが、以下のExceptionが発生していました。
この行でスタックオーバーフローが発生するのは奇妙です。ApplyMixingFromは、追加されたアニメーションごとにのみ呼び出されます。または、手動で TrackEntry.mixingFromを設定すると、それ自体(または円内)に設定されます。

フレームごとに SetAnimation()または AddAnimation()を呼び出していますか? ボタンを押したままにすると? SetAnimation()または AddAnimation()にデバッグログステートメントを追加して、これをすばやく確認できます。

そうでない場合は、 SetAnimation()または AddAnimation()を呼び出すUnityエディターコードを追加しましたか? コード内の TrackEntry.mixingFromを変更していないと仮定します。
-----
Thanks for getting back to us and for the additional info.
Wata писал(а):A colleague of mine had the same problem with the Unity Editor, so he gave me the Unity crash log. This crash may have been caused by something else, but the following Exception was generated.
Getting a stack overflow in this line is strange, ApplyMixingFrom is only called for each added animation, or if manually setting TrackEntry.mixingFrom is set to itself (or in a circle).

Are you perhaps calling SetAnimation() or AddAnimation() every frame, e.g. when holding a button pressed? You could add a debug log statement in SetAnimation() or AddAnimation() to check this quickly.

If not, did you add any Unity Editor code that is calling SetAnimation() or AddAnimation()? I assume that you are not modifying TrackEntry.mixingFrom in your code.
Аватара пользователя
Harald

Harri
  • Сообщения: 2778

Wata

Thanks for pointing that out!

I checked the execution of SetAnimation in the log and found that it was executing more than necessary.
I reduced the number of executions by checking if it was necessary before executing it, and now it doesn't crash.

Thank you very much for your help, it was very helpful.

---

指摘ありがとうございます!

SetAnimationの実行をログで確認したところ、必要以上に実行していることがわかりました。
実行前に必要かどうか確認するようにして実行回数を減らしたところ、crashしないようになりました。

本当にありがとうございます、助かりました。
Wata
  • Сообщения: 3

Harald

これらは素晴らしいニュースです、あなたがそれを理解してくれてとてもうれしいです! 知らせてくれてありがとう。
-----
These are great news, very glad you've figured it out! Thanks for letting us know.
Аватара пользователя
Harald

Harri
  • Сообщения: 2778


Вернуться в 日本のSpine ユーザー