我正在开发一款游戏,我们一直以 JSON 格式存储关卡信息。这些级别非常大,因此我们切换到仅将它们存储在普通 C# 中:
- 顶级方法具有用于级别/对象名称的 switch 语句
- 有几种自动生成的方法可以使用标准属性初始化器“新建”我们的对象树
例子:
private OurObject Autogenerated_Object1()
{
return new OurObject { Name = "Object1", X = 1, Y = 2, Width = 200, Height = 100 };
}
除了这些方法非常大并且具有其他对象的嵌套列表/字典等。
这将加载关卡的时间从 2-3 秒加快到了几分之一秒(在 Windows 上)。与 JSON 相比,编译后的 IL 数据的大小也相当小。
问题是当我们在 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
来解决这个问题吗?有些文件工作正常,但特别是导致错误的文件有 3,000 行方法。无论如何,为模拟器编译都可以正常工作。
这仍然是一个实验,所以我们意识到这是一个非常疯狂的情况。