-
Couldn't load subscription status.
- Fork 174
Description
Title exception in Unity iOS build.
ExecutionEngineException: Attempting to JIT compile method 'MsgPack.Serialization.SerializationContext:GetSerializer<UnityEngine.Quaternion> (object)' while running with --aot-only.
When Serialize does UnityEngine.Quaternion, on used Serializers.RegisterOverride.
But I found a method to avoid an exception.
Exclude comment out in method JIT_compile_Exception_Avoid_Method from next simple code.
Why is this code necessary?
Simple code
using UnityEngine;
using System.IO;
using System.Collections.Generic;
public class QuaternionSerializer: MsgPack.Serialization.MessagePackSerializer<Quaternion>
{
public QuaternionSerializer(MsgPack.Serialization.SerializationContext c)
: base(c)
{
}
protected override void PackToCore(MsgPack.Packer packer, Quaternion objectTree)
{
packer.PackArrayHeader(4);
packer.Pack(objectTree.x);
packer.Pack(objectTree.y);
packer.Pack(objectTree.z);
packer.Pack(objectTree.w);
}
protected override Quaternion UnpackFromCore(MsgPack.Unpacker unpacker)
{
if (!unpacker.IsArrayHeader)
{
throw MsgPack.Serialization.SerializationExceptions.NewIsNotArrayHeader();
}
var count = MsgPack.Serialization.UnpackHelpers.GetItemsCount(unpacker);
if( count != 4 )
{
throw MsgPack.Serialization.SerializationExceptions.NewIsNotArrayHeader();
}
if (!unpacker.IsArrayHeader)
{
throw MsgPack.Serialization.SerializationExceptions.NewIsNotArrayHeader();
}
System.Single x, y, z, w;
if (!unpacker.ReadSingle(out x))
{
throw MsgPack.Serialization.SerializationExceptions.NewMissingItem(0);
}
if (!unpacker.ReadSingle(out y))
{
throw MsgPack.Serialization.SerializationExceptions.NewMissingItem(1);
}
if (!unpacker.ReadSingle(out z))
{
throw MsgPack.Serialization.SerializationExceptions.NewMissingItem(2);
}
if (!unpacker.ReadSingle(out w))
{
throw MsgPack.Serialization.SerializationExceptions.NewMissingItem(2);
}
return new Quaternion(x, y, z, w);
}
}
public class TestMain : MonoBehaviour
{
public class QTest
{
public Quaternion q;
}
void Start()
{
var context = MsgPack.Serialization.SerializationContext.Default;
context.Serializers.RegisterOverride(new QuaternionSerializer(context));
var stream = new MemoryStream();
var q = new QTest();
var serializer = context.GetSerializer<QTest>();
serializer.Pack(stream, q);
stream.Position = 0;
serializer.Unpack(stream);
}
// Avoiding => ExecutionEngineException: Attempting to JIT compile method 'MsgPack.Serialization.SerializationContext:GetSerializer<UnityEngine.Quaternion> (object)' while running with --aot-only.'
public void JIT_compile_Exception_Avoid_Method()
{
//var context = MsgPack.Serialization.SerializationContext.Default;
//context.GetSerializer<Quaternion>();
}
}Environment.
Unity: 5.2.1p4
Xcode: 7.0.1
iOS: 9.0.2
msgpack-cli: 0.6.4 unity3d/MsgPack.dll
Unity iOS Player Settings.
Scripting Backend: Mono2x
Api Compatibility Level: .Net 2.0 Subset
Stripping Level: Disabled
iOSビルドでタイトルにあるExceptionが発生します。
Serializers.RegisterOverrideを使い、UnityEngine.Quaternionをシリアライズする際に起こります。
ただ、Exceptionを回避する方法を見つけました。
次のSimple code中のJIT_compile_Exception_Avoid_Method関数のコメントアウト部分を外すことです。
なぜこのコードが必要なのでしょうか?