1

私はC#とMonoDevelopを使用してMonotouchでiOSゲームを作成しています。非常に奇妙なクラッシュが発生しています。

背景情報:2Dウォーゲームを作成します。ダイクストラのアルゴリズムを実装して、オブジェクトを間に挟んで出発地から目的地までの最短経路を計算しました(例:ここからそこまで移動しますが、車/木/建物/または途中の何かを自動的に移動します)。私のクラッシュは、ダイクストラのアルゴリズムのこの実装のために作成したバイトの2D配列に関連しているようです。ダイクストラのアルゴリズムについて聞いたことがない場合は、この画像を参照してくださいhttp://en.wikipedia.org/wiki/File:Dijkstras_progress_animation.gif

基本的に、2D配列にノードが多いほど、戦場での兵士の動きがより詳細になります。2D配列で2,400ノードを使用すると、すべてが正常に機能/ロードされます。ただし、より詳細な座標のためにノードの数を4,266に増やすと、ノードの距離を計算しているときにプログラムがクラッシュします。クラッシュする前に約30%完了します。

クラッシュの詳細: デバッグ/iPhoneモードまたはリリース/iPhoneモードを使用した場合にのみクラッシュします。Debug / iPhone Simulatorを使用すると、正常に動作します。また、アプリをビルドし、デバッグ/ iPhoneモードを使用して携帯電話に転送し、デバッガーを停止してXCode Instrumentsを開くと、正常に動作します。シミュレーターとXCodeInstrumentsで機能するのに、Monodevelop Debug/iPhoneモードでは機能しない理由がわかりません。XCode Instrumentsは、問題を「パッチ」する何かを行っていますか?それとも、MonoDevelopのデバッガーは、プログラムを「中断」するために何かを実行していますか?

XCodeInstrumentsで動作するプログラムのスクリーンショットは次のとおりです。

スクリーンショットであなたが見ているものを説明させてください。私のアプリは「ウォーゲーム」と呼ばれています。タイムラインを見ると、CPU使用率は約2秒から約35秒まで約100%でした。CPU使用率がゼロに低下すると、読み込みが完了します。したがって、ノードの2D配列をロードし、距離を入力するのに文字通り約33秒かかりました。

クラッシュするこのインスタンスには4,266のノードがあることに注意してください。これは、2D配列がバイト[4266、4266]配列であることを意味します。つまり、2D配列では18,198,756バイトになります。また、XCode Instrumentsで実行すると正常にロードされ、MonoDevelopのDebug /iPhoneSimulatorで実行すると正常にロードされます。しかし、iPhone4sでデバッグ/iPhoneモードで実行すると、エラーメッセージなしでクラッシュします。このアプリのメモリ使用量は、スクリーンショットで見られる約60.73MBです。

クラッシュしないインスタンスでは、2,400ノードがありました。これは、2D配列がバイト[2400、2400]配列であることを意味します。つまり、2D配列では5,760,000バイトになります。そして、それはどこでもうまくいきました。

ノードの数を約4,266以上に増やすと、プログラムがクラッシュすることが明らかに問題のようです。しかし、エラーメッセージは表示されません。読み込み中に突然停止します... これはガベージコレクションの問題でしょうか? その権利についてはエラーメッセージが表示されると思いますか? これは「メモリ不足」の問題でしょうか? しかし、XCodeのInstrumentsを使用してロードすると、使用しているのは60MBのみであり、以前はテストとしてこのアプリで最大150MBを使用したことがあるため、クラッシュする前に少なくとも最大150MBのメモリ使用量を使用できることがわかっています。 「メモリ不足エラー」。

これは、XCodeInstrumentsからのメモリ割り当てのショットです。 これは、XCodeInstrumentsからのメモリ割り当てのショットです。

これは、XCodeInstrumentsからのメモリリークのページのショットです。 これは、XCodeInstrumentsからのメモリリークのページのショットです。

4

1 に答える 1

1

それ、変だよ。これはデバッガーのバグのように見えます。デバッガーを使用するとメモリ不足の状態になる可能性があります(通常のビルドよりも多くのメモリが必要になるため)。

ただし、XcodeのInstrumentsの場合と同様に、問題なく手動でリリースビルドを開始できるはずです。

問題が1つ以上あると思います。たとえば、アプリケーションの起動に時間がかかりすぎて、ウォッチドッグがアプリケーションを強制終了します(リリースビルドの場合)。XcodeのInstrumentから起動すると、ウォッチドッグが無音になるため、これでも機能します。

より多くの情報がなければ、これ以上正確にすることはできません(stackoverflowには適していません)。バグレポートを開き、デバッグビルド(MonoDevelopによって開始)とリリースビルド(手動で開始)の両方のクラッシュログを添付することをお勧めします。

于 2012-11-26T19:04:27.083 に答える