2012-05-15 4 views
7

私はゲームを開発中で、レベル情報をJSON形式で保存しています。これらのレベルは非常に大きいので、我々は単なるC#でそれらを格納するために切り替わっ:MonoTouch AOTコンパイラ - 大規模メソッドが失敗する

  • トップレベルの方法は、レベル/オブジェクト
  • の名前のswitch文を持っているいくつかの自動生成の方法があります。 「アップ新」標準のプロパティinititalizers
  • とのオブジェクトツリー

例:これらのメソッドを除き

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

が非常に大きいとリストを入れ子にしている/言葉遣い他のオブジェクトの牡羊などを使用します。

これは、レベルを2〜3秒から1秒まで(Windowsでは)読み込む時間を短縮しました。 JSONと比較してILをコンパイルすると、データのサイズもかなり小さくなります。

問題は、我々はMonoTouchでのためにMonoDevelopの中でこれらをコンパイルするとき、我々は取得されています

-v -v -v

mtouch exited with code 1

は、私たちがエラーを見ることができ、オン:

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行の方法です。シミュレータのためのコンパイルは何に関係なく正常に動作します。

これはまだ実験的なので、これはかなりクレイジーな状況です。

+0

小さなレベルで動作しますか? –

+0

はい、小さいレベルでうまく動作します。特定のブッシュやツリーを追加するとすぐに問題が発生し、シミュレータはうまく動作します。 – jonathanpeppers

+0

バグレポートを記入してください:) – poupou

答えて

4

これらのアサーションは、がAOTコンパイラでは発生しないような条件になったときに発生します()。あなたは、それは別のコード生成エンジンだからLLVMを使用して(またはそれを使用していない)でこの問題を回避することができるかもしれないhttp://bugzilla.xamarin.com

Is there some argument we can pass to mtouch to fix this?

に、このような例を報告してください。これが発生する段階(一部は共有されている)に応じて、同じ状態になることはありません。

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

+0

サンプルプロジェクトを作成し、バグを報告します。 ../../../../../mono/mono/mini/ssa.c:243、条件 'stack_history_len jonathanpeppers

+0

バグはこちら:https://bugzilla.xamarin.com/show_bug.cgi?id = 5093 – jonathanpeppers

+0

ゾルタンによれば、試してみるまでアルファ/ベータチャンネルに入るまでの時間は固定されているとは言えません。 – jonathanpeppers

1

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

+0

私はそれを見ました。問題は、リスト/ディクショナリを入れ子にしていて、さらに複数のリスト(ギザギザの配列)を持つクラスで、それはサポートされていません。 – jonathanpeppers

+0

内部配列/リストをクラスとしてラップし、そのように直列化することができます。しかし、あなたは既にそのオプションを探っているでしょう。 – tamaslnagy

+0

MsgPackは別のオプションです。私はそれをネットワーク上でシリアル化するために使用しており、ある時点でJsonを置き換えてディスクへのシリアル化を高速化することもあります。 –

関連する問題