1

cocos2d と box2d、パドル、ボール、ブリックを使って目的の C で iPhone ゲームを作成しています。別の関数に半径方向の重力コードを追加しましたが、ここでおかしくなりました。コードは呼び出されず、メソッド内にあるだけで、まったく関係のないパドル コードが壊れます。

別のクラスに nslog を追加すると、さらに奇妙になります。x 上を移動しない状態から、y 上を移動せず、x を移動し始める状態に切り替わるからです。コードのランダムなビットをコメントアウトすると、動作または再ブレークが開始されます。box2d コードを移動して移動できますが、機能するかどうかはわかりません。すべてがランダムです。

誰がこれを引き起こす可能性があるか知っていますか? Objective-C に最大メソッド サイズはありますか? オーバーフローする可能性があります。このクラスの 1 つのメソッドは非常に大きいですか? アイデアはありますか?

ここにいくつかのコードがあります。ボックス本体が反転しただけの同じコードの場合、一致があります。このように、さまざまな物理体が相互作用するものは他にもたくさんあります。それらのいずれかの両方をコメントアウトすると、機能します。そうではないし、そうでもない

if (spriteA.tag == kSpritePowerUp && spriteB.tag == kSpritePaddle) {
  if (std::find(toDestroy.begin(), toDestroy.end(), bodyB) == toDestroy.end()) {
    PowerUp *tempPowerUp = (PowerUp*)bodyA->GetUserData();//spriteA;
    Paddle* tempPaddle = (Paddle*)bodyB->GetUserData();//spriteB;
    [tempPaddle addPowerUp:tempPowerUp];
    [self playSoundEffect:kGameSoundPowerUp];
    toDestroy.push_back(bodyA);
  }
}

編集:解決しました。すべてのクラスを1行ずつすべて調べました。リークを実行し、2 を見つけました。

しかし、最終的には、false に自動初期化されるために依存していたユーティリティ関数の 2 つのローカル ブール値であることが判明しました。ほとんどの場合そうですが、そうでない場合もあります。特に理由はありません。月の満ち欠けとか。

4

1 に答える 1

1

うん。まず共感します。私たちは皆そこにいました。

ほぼ 100% の確実性で、メモリ処理にバグがあります。オブジェクトを別のもので上書きしているか、一般的に意図しないメモリをクラップしており、その副作用は単に潜在的なランダム性です。

Xcode ([ビルド] の下) で静的アナライザーを実行して開始します。これにより、いくつかの明らかなメモリの問題が特定されますが、これらは必ずしも表示されているものではありません。

大きなブロックをコメントアウトすることは、ここで便利なデバッグツールになる可能性があります. そこから絞ります。

(何らかの形でジャンクになっているメモリの特定の部分を特定した場合は、メモリ ブレークポイントを設定できる可能性があります。Xcode/GDB でこれを行う方法はわかりませんが、他の誰かが行うことを願っています。)

于 2010-08-27T22:58:37.453 に答える