2012-05-15 2 views
7

Я работаю над игрой, и мы сохраняем информацию о нашем уровне в формате JSON. Эти уровни являются довольно большими, поэтому мы перешли просто хранить их в простом языке C#:MonoTouch AOT Compiler - большие методы сбой

  • Метод верхнего уровня имеет переключатель заявление для названия уровня объекта/
  • Есть несколько автоматически генерируемые методов, «новая вверх» наш объект дерево со стандартным inititalizers собственности

Пример:

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

Кроме этих методы очень большой и вложенные списки/дикция арий других объектов и т. д.

Это ускорило время загрузки уровня от 2-3 секунд до доли секунды (в Windows). Размер наших данных также значительно меньше, поскольку компилируется IL по сравнению с JSON.

Проблема заключается в том, когда мы собираем их в MonoDevelop для MonoTouch, мы получаем:

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, чтобы исправить это? Некоторые файлы работают нормально, но, в частности, причина, по которой ошибка имеет метод 3000 строк. Компиляция для симулятора отлично работает независимо от того, что.

Это еще эксперимент, поэтому мы понимаем, что это довольно сумасшедшая ситуация.

+0

Работает ли он с небольшими уровнями? –

+0

Да, отлично работает с меньшими уровнями. Как только я добавляю конкретный куст или дерево, начинается проблема - и симулятор отлично работает. – jonathanpeppers

+0

Пожалуйста, заполните сообщение об ошибке :) – poupou

ответ

4

Эти утверждения возникают, когда вы нажимаете условие, которое должно никогда не встречаются в компиляторе AOT. Пожалуйста, сообщайте о таких случаях http://bugzilla.xamarin.com

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

Вы могли быть в состоянии обойти это с помощью LLVM (или не использования), так как это другое поколение код двигателя. В зависимости от того, на каком этапе это происходит (некоторые из них разделены), вы не можете столкнуться с тем же условием.

Конечно, сборки LLVM работают медленнее и не поддерживают отладку, поэтому это не идеальное решение для любых ситуаций.

+0

Я сделаю образец проекта и сообщите об ошибке. Я получаю схожую ошибку с LLVM: '* Assertion at ../../../../../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 для более быстрой сериализации на диск. –