7

私はゲームに取り組んでおり、レベル情報を JSON 形式で保存しています。これらのレベルは非常に大きいため、単純な C# に格納するだけに切り替えました。

  • 最上位のメソッドには、レベル/オブジェクトの名前の switch ステートメントがあります
  • 標準のプロパティ初期化子を使用してオブジェクト ツリーを「新規作成」する自動生成メソッドがいくつかあります。

例:

private OurObject Autogenerated_Object1()
{
   return new OurObject { Name = "Object1", X = 1, Y = 2, Width = 200, Height = 100 };
}

ただし、これらのメソッドは非常に大きく、他のオブジェクトのネストされたリスト/辞書などを持っています。

これにより、レベルのロード時間が 2 ~ 3 秒から 1 秒未満に短縮されました (Windows の場合)。コンパイルされた IL は JSON と比較して、データのサイズもかなり小さくなっています。

問題は、これらを MonoTouch 用に MonoDevelop でコンパイルすると、次のようになることです。

mtouch exited with code 1

-v -v -vオンにすると、次のエラーが表示されます。

MONO_PATH=/Users/jonathanpeppers/Desktop/DrawAStickman/Game/Code/iOS/DrawAStickman.iPhone/bin/iPhone/Release/DrawAStickmaniPhone.app /Developer/MonoTouch/usr/bin/arm-darwin-mono --aot=mtriple=armv7-darwin,full,static,asmonly,nodebug,outfile=/var/folders/4s/lcvdj54x0g72nrsw9vzq6nm80000gn/T/tmp54777849.tmp/monotouch.dll.7.s "/Users/jonathanpeppers/Desktop/DrawAStickman/Game/Code/iOS/DrawAStickman.iPhone/bin/iPhone/Release/DrawAStickmaniPhone.app/monotouch.dll"
AOT Compilation exited with code 134, command:
MONO_PATH=/Users/jonathanpeppers/Desktop/DrawAStickman/Game/Code/iOS/DrawAStickman.iPhone/bin/iPhone/Release/DrawAStickmaniPhone.app /Developer/MonoTouch/usr/bin/arm-darwin-mono --aot=mtriple=armv7-darwin,full,static,asmonly,nodebug,outfile=/var/folders/4s/lcvdj54x0g72nrsw9vzq6nm80000gn/T/tmp54777849.tmp/DrawAStickmanCore.dll.7.s "/Users/jonathanpeppers/Desktop/DrawAStickman/Game/Code/iOS/DrawAStickman.iPhone/bin/iPhone/Release/DrawAStickmaniPhone.app/DrawAStickmanCore.dll"
Mono Ahead of Time compiler - compiling assembly /Users/jonathanpeppers/Desktop/DrawAStickman/Game/Code/iOS/DrawAStickman.iPhone/bin/iPhone/Release/DrawAStickmaniPhone.app/DrawAStickmanCore.dll
* Assertion: should not be reached at ../../../../../mono/mono/mini/mini-arm.c:2758

AOT 用にコンパイルする場合、メソッドの行数に制限はありますか? mtouchこれを修正するために渡すことができる引数はありますか? 一部のファイルは正常に動作しますが、特にエラーを引き起こすファイルには 3,000 行のメソッドがあります。シミュレーター用のコンパイルは、何があっても問題なく動作します。

これはまだ実験段階であるため、これは非常にクレイジーな状況であることがわかります。

4

2 に答える 2

4

これらのアサートは、AOT コンパイラでは決して発生しない条件にヒットしたときに発生します。このような場合は、 http://bugzilla.xamarin.comに報告してください。

これを修正するために mtouch に渡すことができる引数はありますか?

LLVM は別のコード生成エンジンであるため、LLVM を使用する (または使用しない) ことで、これを回避できる場合があります。これが発生する段階 (一部は共有されます) によっては、同じ状態に陥らない場合があります。

もちろん、LLVM ビルドは遅く、デバッグをサポートしていないため、これはあらゆる状況で理想的な回避策ではありません。

于 2012-05-15T16:01:28.460 に答える
1

レベルの保存に関する単なる推奨事項。プロトコルバッファのような非常に高速なバイナリ形式でレベルを保存することを検討しましたか?.NETには、Protobuf-netと呼ばれるすばらしいプロトコルバッファライブラリがあり、チェックアウトすることをお勧めします。

于 2012-05-16T20:47:15.497 に答える