2012-05-15 21 views
7

मैं एक गेम पर काम कर रहा हूं, और हम JSON प्रारूप में हमारी स्तर की जानकारी संग्रहीत कर रहे हैं। इन स्तरों काफी बड़े हैं, इसलिए हम बस में सादा सी # उन्हें भंडारण में स्विच:मोनो टच एओटी कंपाइलर - बड़ी विधियां विफल

  • एक शीर्ष स्तर विधि स्तर/वस्तु के नाम के लिए एक स्विच बयान है
  • कई स्वत: जनरेट तरीकों रहे हैं कि "नए अप" मानक संपत्ति inititalizers
  • के साथ हमारे वस्तु पेड़

उदाहरण:

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

इन तरीकों को छोड़कर बहुत बड़े हैं और सूचियों नेस्ट है/ढ़ंग अन्य वस्तुओं की मेष, आदि

इसने 2-3 सेकंड से एक सेकंड (विंडोज़ पर) के अंश को लोड करने का समय बढ़ाया है। जेएसओएन की तुलना में संकलित आईएल के रूप में हमारे डेटा का आकार भी काफी छोटा है।

समस्या यह है कि जब हम 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 

वहाँ कोई सीमा है एओटी के लिए संकलन करते समय, विधि में लाइनों की संख्या के लिए? क्या कोई तर्क है कि हम इसे ठीक करने के लिए mtouch पर जा सकते हैं? कुछ फाइलें ठीक काम करती हैं, लेकिन विशेष रूप से एक त्रुटि के कारण 3,000 लाइन विधि होती है। सिम्युलेटर के लिए संकलन ठीक काम करता है इससे कोई फर्क नहीं पड़ता।

यह अभी भी एक प्रयोग है, इसलिए हमें एहसास है कि यह एक बहुत पागल स्थिति है।

+0

क्या यह छोटे स्तरों के साथ काम करता है? –

+0

हां, छोटे स्तरों के साथ ठीक काम करता है। जैसे ही मैं एक विशेष झाड़ी या पेड़ जोड़ता हूं, मुसीबत शुरू होती है - और सिम्युलेटर ठीक काम करता है। – jonathanpeppers

+0

कृपया एक बग रिपोर्ट भरें :) – poupou

उत्तर

4

उन आवेषण तब होते हैं जब आप एओटी कंपाइलर में होने वाली स्थिति को हिट करते हैं। आप LLVM का उपयोग कर (या इसे प्रयोग नहीं) के बाद से यह एक अलग कोड पीढ़ी इंजन है द्वारा इस समाधान करने में सक्षम हो सकता है http://bugzilla.xamarin.com

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

को इस तरह के मामलों की रिपोर्ट करें। यह किस चरण पर होता है (कुछ साझा किए जाते हैं) आप शायद उसी स्थिति में नहीं चल सकते हैं।

बेशक एलएलवीएम बिल्ड धीमे हैं और डीबगिंग का समर्थन नहीं करते हैं, इसलिए यह हर परिस्थिति के लिए एक आदर्श कामकाज नहीं है।

+0

मैं एक नमूना प्रोजेक्ट बनाउंगा और बग की रिपोर्ट करूंगा। मुझे एलएलवीएम के साथ संकलित एक समान त्रुटि मिलती है: '* Assertion ../../../../../mono/mono/mini/ssa.c3943, स्थिति '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 एक और विकल्प है। मैं इसे नेटवर्क पर क्रमबद्ध करने के लिए उपयोग कर रहा हूं और किसी बिंदु पर डिस्क पर तेज क्रमिकरण के लिए जेसन को प्रतिस्थापित करने के लिए इसका उपयोग कर सकता हूं। –