2012-05-15 5 views
7

Ich arbeite an einem Spiel, und wir haben unsere Level-Informationen im JSON-Format gespeichert. Diese Ebenen sind recht groß, so wechselten wir nur sie einfach in C# zu speichern:MonoTouch AOT Compiler - große Methoden fehlschlagen

  • Ein Top-Level-Methode hat eine Switch-Anweisung für den Namen der Ebene/Objekt
  • Es gibt mehrere automatisch generierte Methoden, die "new up" unser Objektbaum mit Standard-Eigenschaft inititalizers

Beispiel:

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

Außer diesen Methoden sind sehr groß und haben Listen verschachtelt/Diktion Widgets anderer Objekte usw.

Dies hat die Ladezeit eines Levels von 2-3 Sekunden auf Bruchteile von Sekunden (unter Windows) beschleunigt. Die Größe unserer Daten ist auch wesentlich geringer, als bei kompilierter IL im Vergleich zu JSON.

Das Problem ist, wenn wir diese in MonoDevelop für Monotouch kompilieren, erhalten wir:

mtouch exited with code 1

Mit -v -v -v eingeschaltet, wir den Fehler sehen:

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 

Gibt es ein Limit auf die Anzahl der Zeilen in einer Methode, wenn für AOT kompiliert? Gibt es ein Argument, das wir an mtouch weitergeben können, um das zu beheben? Einige Dateien funktionieren gut, aber eine, die den Fehler verursacht, hat eine 3000-Zeilen-Methode. Kompilieren für den Simulator funktioniert gut, egal was.

Dies ist immer noch ein Experiment, also erkennen wir, dass dies eine ziemlich verrückte Situation ist.

+0

Funktioniert es mit kleinen Pegeln? –

+0

Ja, funktioniert mit kleineren Ebenen. Sobald ich einen bestimmten Busch oder Baum hinzufüge, beginnt der Fehler - und der Simulator funktioniert gut. – jonathanpeppers

+0

Bitte füllen Sie einen Fehlerbericht :) – poupou

Antwort

4

Diese Behauptungen tritt auf, wenn Sie eine Bedingung treffen, die nie im AOT-Compiler auftreten sollte. Bitte melden Sie solche Fälle http://bugzilla.xamarin.com

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

Sie könnte Lage sein, dies zu umgehen, indem LLVM (oder es nicht verwenden), da es ein anderer Code-Generierung Motor ist. Abhängig davon, in welchem ​​Stadium dies geschieht (einige sind geteilt), können Sie nicht in den gleichen Zustand geraten.

Natürlich sind LLVM-Builds langsamer und unterstützen kein Debugging, daher ist dies keine ideale Problemumgehung für jede Situation.

+0

Ich werde ein Beispielprojekt machen und den Fehler melden. Ich bekomme einen ähnlichen Fehler beim Kompilieren mit LLVM: '* Assertion at ../../../../../mono/mono/mini/ssa.c:243, Bedingung' stack_history_len jonathanpeppers

+0

Bug ist hier: https://bugzilla.xamarin.com/show_bug.cgi?id = 5093 – jonathanpeppers

+0

Zoltan sagt, es ist behoben, nicht sicher, wie lange bis es im Alpha/Beta-Kanal ist, um es auszuprobieren. – jonathanpeppers

1

Nur eine Empfehlung für die Speicherung der Ebenen. Haben Sie darüber nachgedacht, die Ebenen in einem sehr schnellen Binärformat wie Protocol Buffers zu speichern? .NET verfügt über eine wunderbare Protokollpufferbibliothek namens Protobuf-net, die Sie möglicherweise auschecken möchten.

+0

Ich habe es angeschaut, Problem ist, ich habe verschachtelte Listen/Wörterbücher, plus Klasse mit mehreren Listen (gezackte Arrays) und es hat keine Unterstützung dafür. – jonathanpeppers

+0

Sie können die inneren Arrays/Listen möglicherweise als Klassen verpacken und auf diese Weise serialisieren. Aber Sie haben diese Option wahrscheinlich schon erkundet. – tamaslnagy

+0

MsgPack ist eine andere Option. Ich benutze es, um über das Netzwerk zu serialisieren und zu einem bestimmten Zeitpunkt kann es Json für schnellere Serialisierung auf die Festplatte ersetzen. –

Verwandte Themen