編集5:最適化レベルのビルド設定:
編集4:ビルド構成を変更して、すべてを「デバッグ」にしてから「テスト」のために実行しようとしました。奇妙なことに、約20回はクラッシュしませんでした(さまざまなアセットを使用してさまざまなGameScenesのロードとアンロードを続けました)。21回目(統計的に関連性がなくても)、もうクラッシュしないかもしれないと思っていましたが、クラッシュしました。要約はまだ利用できないので、私はそれを正しく行っているのか、それとも他の問題があるのか疑問に思っています。ビルド構成とクラッシュレポートは次のとおりです。
編集3:重要なことに、このバグは6/7回に1回の実行など、ごく一部しか発生しないため、特定するのは困難です。
どのテクスチャがこのNSAssertを失敗させているのかを理解するのに深刻な問題があります。私はいくつかのアプローチを試しましたが、どれもうまくいきませんでした(またはおそらく私だけが少し愚かすぎます:))。
デバッガーでは、GLuint情報を確認できます。インターネットで読んだところ、それがフレーム(一種のポインター)を参照する方法であることがわかりました。
batchNode plistファイルからフレーム名を取得する方法があるはずだと思い、このGLuint番号がplistファイル内のフレームの順序に何らかの形で対応できるかどうか疑問に思いました。
NSAssert( !batchNode_ || texture.name == batchNode_.texture.name , @"CCSprite: Batched sprites should use the same texture as the batchnode");
/** texture name */
@property(nonatomic,readonly) GLuint name;
私はそれらのアプローチを試しましたが、それらはすべてのケースを捕らえます:
//From CCSprite.m
-(void) setTexture:(CCTexture2D*)texture
{
if(!batchNode_ || texture.name != batchNode_.texture.name)
{
CCLOG(@""); // I added a debug here but it catches all cases..
NSAssert( !batchNode_ || texture.name == batchNode_.texture.name , @"CCSprite: Batched sprites should use the same texture as the batchnode");
}
編集:私はちょっとクレイジーだと知っていますが、正しく初期化できないように見えるので、CCTexture2DでfileNameを初期化する試みを貼り付けます:
- (id) initWithString:(NSString*)string dimensions:(CGSize)dimensions hAlignment:(CCTextAlignment)hAlignment vAlignment:(CCVerticalTextAlignment) vAlignment lineBreakMode:(CCLineBreakMode)lineBreakMode font:(UIFont*)uifont
{
NSAssert( uifont, @"Invalid font");
fileName=string;//TODO: Remove
.....
}
上記のものは、私が変更できた唯一のinitWithStringです。この他の1つのfileNameプロパティを変更することはできません:
#elif defined(__CC_PLATFORM_MAC)
- (id) initWithString:(NSString*)string dimensions:(CGSize)dimensions hAlignment:(CCTextAlignment)hAlignment vAlignment:(CCVerticalTextAlignment)vAlignment attributedString:(NSAttributedString*)stringWithAttributes
編集2:fileNameを次のように割り当てようとしました:
fileName = [string copy];
しかし、ここで報告されているように、それでも要約は利用できません。
問題はアニメーションの更新中にsetTextureで発生するようですが、fileNameは元々間違っているようです。
これが、CCTexture2Dでプロパティを宣言した方法です。
@property(nonatomic, copy) NSString* fileName; //TODO Remove