2012-05-15 5 views
7

저는 게임을 진행하고 있으며 레벨 정보를 JSON 형식으로 저장하고 있습니다. 이 수준은 매우 큰, 그래서 우리는 그냥 일반 C 번호에 저장하기 위해 전환 : MonoTouch AOT 컴파일러 - 대용량 메소드가 실패합니다.

  • 여러 자동 생성 방법이 있습니다 톱 레벨의 방법은 레벨/객체의 이름에 대한 스위치 문이

    • 그 "가 새로운"표준 속성 inititalizers
    • 우리 오브젝트 트리

    예 :이 방법을 제외하고

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

    이 매우 크고 목록을 중첩 한/어법 다른 물체의 양자리 등이 있습니다.

    이렇게하면 2-3 초에서 몇 초 (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

    샘플 프로젝트를 만들고 버그를보고합니다. 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을 대체하여 디스크에보다 빠른 직렬화를 사용할 수도있다. –