6

次のスタック トレースを含むバグ レポートを受け取りましたが、何が問題なのかわかりません。これは、テクスチャ アトラスにエミッターのイメージがあるか、エミッターが追加されたのと同じ実行ループでエミッターを削除することによって引き起こされる可能性があるという提案を見てきましたが、これらのいずれも発生していないと思います。これは散発的な問題であり、再現することはできません。バグレポートでのみ表示されます。どんな助けでもいいです。

0    libsystem_platform.dylib    OSSpinLockLock + 1
1    SpriteKit   SKSpinLockSync(int*, void ()() block_pointer) + 92
2    SpriteKit   -[SKTexture loadImageData] + 300
3    SpriteKit   -[SKTexture size] + 42
4    SpriteKit   SKCEmitterSprite::update(double) + 3136
5    SpriteKit   SKCSprite::update(double) + 354
6    SpriteKit   SKCSprite::update(double) + 354
7    SpriteKit   -[SKScene _update:] + 174
8    SpriteKit   -[SKView(Private) _update:] + 324
9    SpriteKit   -[SKView renderCallback:] + 820
10   SpriteKit   __29-[SKView setUpRenderCallback]_block_invoke + 130
11   SpriteKit   -[SKDisplayLink _callbackForNextFrame:] + 254
12   QuartzCore  CA::Display::DisplayLinkItem::dispatch() + 98
13   QuartzCore  CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 344
14   IOMobileFramebuffer     IOMobileFramebufferVsyncNotifyFunc + 104
15   IOKit   IODispatchCalloutFromCFMessage + 248
16 ...   CoreFoundation  __CFMachPortPerform + 136
17   CoreFoundation  __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 34
18   CoreFoundation  __CFRunLoopDoSource1 + 346
19   CoreFoundation  __CFRunLoopRun + 1406
20   CoreFoundation  CFRunLoopRunSpecific + 524
21   CoreFoundation  CFRunLoopRunInMode + 106
22   GraphicsServices    GSEventRunModal + 138
23   UIKit   UIApplicationMain + 1136
24   myApplication  main.m line 16  main

編集:私は今、エミッターで常にではなく、いくつかの異なる状況で SKSpinLockSync 問題が発生することに気付きました。エミッターで頻繁に見られる唯一の理由は、それがアプリでの画像読み込みのライオンズシェアであるため、統計的に最も可能性が高いからだと思います. スタック トレースの先頭 4 行は常に同じです。したがって、最大で[SKTexture Size].

4

7 に答える 7

2

同様のケースで同じクラッシュを経験し、解決できました

私の場合、SKAction を介して画像シーケンスを再生しようとしていました。

[SKAction animateWithTextures: timePerFrame:]

原因はわかりませんが、テクスチャがプリロードされていないことが関係しているのではないかと推測しています。メソッドのドキュメントには、事前にロードする必要があるかどうかについての洞察は提供されていないため、純粋に推測ですが、SpriteKit は、画像を表示するのに十分な速度で画像をロードできなかったため、窒息しているようです。

いずれにせよ、使用[SKTexture preloadTextures:...するとクラッシュが完全に解決されます

それがあなたや他の人にも役立つことを願っています!

于 2014-02-25T21:40:22.227 に答える
2

OSSpinLockは、マルチスレッド アプリでのアトミック操作を保証するメカニズムです。

ここにマルチスレッドの問題があるとは思いませんが、作業のアトミック部分でクラッシュするデータが loadImageData によって提供された可能性があります。これは、バンドル内のテクスチャが見つからない (または破損している、またはサポートされていないファイル形式) ことが原因である可能性があります。テクスチャのロードが失敗するのは、間違いなくエミッタです。

しばらくの間、リリース構成 (スキームを編集) でアプリをテストしてみてください。一部のバグは、最適化が有効になっているリリース ビルドでのみ表面化します。アプリのアドホック バージョンをビルドし、デバイスに展開してテストすることもできます。現時点での最初の目標は、自分のデバイスで問題を確認することです。そうしないと、特定するのが難しい場合があります。

コール スタックは、いくつかのヒントを提供します。問題は、シーンの子である別のスプライトの子であるスプライトの子であるエミッタにあります。おそらくそれはそれを絞り込みます。

于 2013-10-18T13:06:16.593 に答える
0

同時に複数を使用SKEmitterNodeして作成すると (ほぼ同時に閉じる)、ゲームがクラッシュしました。手動でプリロード (エミッターを作成してシーンに追加) する必要がありましたが、それまでにクラッシュを防ぐことができ、パーティクル エフェクトを作成してシーンに追加し、アクションを実行させる必要がありました。次に、パーティクルのアルファを 0 に設定して非表示にします。それまでに、私はがっかりして、すべてをプリロードしました。

SKEmitterNode上記の方法を使用しgetEmitterても、ほぼ同時に複数のエミッタを作成するとクラッシュが発生します。これを解決するには、最初にパーティクルの 1 つを作成し、それをシーンに追加して、alpha0 に設定します。

例:

@implementation MyGameScene

- (instancetype)initWithSize:(CGSize)size
{
    if(self = [super initWithSize:size]){
        HitEmitter *emitter = [HitEmitter particle]; // class method use getEmitter method
        [self addChild:emitter];
        [emitter setName:@"temp"];
        [emitter setAlpha:0];

        // add a second timer to remove it.
        [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(removeEmitter) userInfo:nil repeats:NO];
    } return self;
}
于 2014-10-26T04:30:01.767 に答える
0

スプライト キットのパーティクルでこの正確な問題 (同じクラッシュ ログ スタック) が発生しました。私は何時間もかけて多くのことを試しましたが、最終的にそれを理解しました。ソース テクスチャが Texture Atlas フォルダにあり、対応する @2x 画像がなかったことが原因のようです。テクスチャ アトラスからテクスチャを移動するか、@2x バージョンの画像を追加してみてください。

于 2014-01-21T21:01:01.310 に答える
0

SpriteKit を使用してゲームを作成する際にも同様の問題がありました。インターネット検索から取得できるすべての投稿は、ソリューションに対して無効でした。アクションにマルチスレッドの概念が含まれている場合、バンドル内のテクスチャの破損や欠落ではなく、特殊なアクション タイプがこの問題を引き起こすことがあります。そして、私はそれを解決しました!言い換えれば、見かけ上のマルチスレッドがないように見えても、間接的にコードに一種のマルチスレッドが含まれている可能性があります。

于 2013-11-12T16:32:20.120 に答える