日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

U3D开发中关于脚本方面的限制-有关IOS反射和JIT的支持问题

發(fā)布時間:2025/3/18 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 U3D开发中关于脚本方面的限制-有关IOS反射和JIT的支持问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

U3D開發(fā)中關(guān)于腳本方面的限制-有關(guān)IOS反射和JIT的支持問題

U3D文檔中說明了,反射在IOS是支持的,除了system.reflection.emit空間內(nèi)的,其它都支持。JIT是不支持的

本質(zhì)上來說即是:只要不在運行時動態(tài)生成代碼的行為都支持,reflection.emit下的功能可以動態(tài)的生成代碼(生成程序集,生成類,生成函數(shù),生成類型等,是真正的生成代碼),JIT也能動態(tài)的生成代碼(如C#生成的IL在各平臺上運行時可以由JIT編譯成匯編語言)。

其它的并不會生成代碼的反射功能是可以用的,如 type.gettype, getfield,?Activator.CreateInstance? ?

文檔如下:

Scripting restrictions

We strive to provide a common scripting API and experience across all platforms Unity supports. However, some platforms have inherent restrictions. To help you understand these restrictions and support cross-platform code, the following table describes which restrictions apply to each platform and scripting backend:

PlatformScripting BackendRestrictions
StandaloneMonoNone
WebGLIL2CPPAhead-of-time compile, No threads
iOSIL2CPPAhead-of-time compile
AndroidMonoNone
AndroidIL2CPPAhead-of-time compile
Samsung TVMonoAhead-of-time compile
TizenMonoAhead-of-time compile
XBox OneMonoAhead-of-time compile
XBox OneIL2CPPAhead-of-time compile
WiiUMonoAhead-of-time compile
PS VitaMonoAhead-of-time compile
PS VitaIL2CPPAhead-of-time compile
PS4MonoAhead-of-time compile
PS4IL2CPPAhead-of-time compile
Windows Store.NETUses .NET Core class libraries subset
Windows StoreIL2CPPAhead-of-time compile

Ahead-of-time compile

Some platforms do not allow runtime code generation. Therefore, any managed code which depends upon just-in-time (JIT) compilation on the target device will fail. Instead, we need to compile all of the managed code ahead-of-time (AOT). Often, this distinction doesn’t matter, but in a few specific cases, AOT platforms require additional consideration.

System.Reflection.Emit

An AOT platform cannot implement any of the methods in the System.Reflection.Emit namespace. Note that the rest of System.Reflection is acceptable, as long as the compiler can infer that the code used via reflection needs to exist at runtime.

Serialization

AOT platforms may encounter issues with serialization and deserlization due to the use of reflection. If a type or method is only used via reflection as part of serialization or deserialization, the AOT compiler cannot detect that code needs to be generated for the type or method.

Generic virtual methods

Generic methods require the compiler to do some additional work to expand the code written by the developer to the code actually executed on the device. For example, we need different code for List with an int or a double. In the presence of virtual methods, where behavior is determined at runtime rather than compile time, the compiler can easily require runtime code generation in places where it is not entirely obvious from the source code.

Suppose we have the following code, which works exactly as expected on a JIT platform (it prints “Message value: Zero” to the console once):

using UnityEngine; using System;public class AOTProblemExample : MonoBehaviour, IReceiver {public enum AnyEnum {Zero,One,}void Start() {// Subtle trigger: The type of manager *must* be// IManager, not Manager, to trigger the AOT problem.IManager manager = new Manager();manager.SendMessage(this, AnyEnum.Zero);}public void OnMessage<T>(T value) {Debug.LogFormat("Message value: {0}", value);} }public class Manager : IManager {public void SendMessage<T>(IReceiver target, T value) {target.OnMessage(value);} }public interface IReceiver {void OnMessage<T>(T value); }public interface IManager {void SendMessage<T>(IReceiver target, T value); }

When this code is executed on an AOT platform with the IL2CPP scripting backend, this exception occurs:

ExecutionEngineException: Attempting to call method 'AOTProblemExample::OnMessage<AOTProblemExample+AnyEnum>' for which no ahead of time (AOT) code was generated.at Manager.SendMessage[T] (IReceiver target, .T value) [0x00000] in <filename unknown>:0 at AOTProblemExample.Start () [0x00000] in <filename unknown>:0

Likewise, the Mono scripting backend provides this similar exception:

ExecutionEngineException: Attempting to JIT compile method 'Manager:SendMessage<AOTProblemExample/AnyEnum> (IReceiver,AOTProblemExample/AnyEnum)' while running with --aot-only.at AOTProblemExample.Start () [0x00000] in <filename unknown>:0

The AOT compiler does not realize that it should generate code for the generic method OnMessage with a T of AnyEnum, so it blissfully continues, skipping this method. When that method is called, and the runtime can’t find the proper code to execute, it gives up with this error message.

To work around an AOT issue like this, we can often force the compiler to generate the proper code for us. If we add a method like this to the AOTProblemExample class:

public void UsedOnlyForAOTCodeGeneration() {// IL2CPP needs only this line.OnMessage(AnyEnum.Zero);// Mono also needs this line. Note that we are// calling directly on the Manager, not the IManager interface.new Manager().SendMessage(null, AnyEnum.Zero);// Include an exception so we can be sure to know if this method is ever called.throw new InvalidOperationException("This method is used for AOT code generation only. Do not call it at runtime."); }

When the compiler encounters the explicit call to OnMessage with a T of AnyEnum, it generates the proper code for the runtime to execute. The method UsedOnlyForAOTCodeGeneration does not ever need to be called; it just needs to exist for the compiler to see it.

No threads

Some platforms do not support the use of threads, so any managed code that uses the System.Threading namespace will fail at runtime. Also, some parts of the .NET class libraries implicitly depend upon threads. An often-used example is the System.Timers.Timer class, which depends on support for threads.

posted on 2018-09-09 23:04 時空觀察者9號 閱讀(...) 評論(...) 編輯 收藏

總結(jié)

以上是生活随笔為你收集整理的U3D开发中关于脚本方面的限制-有关IOS反射和JIT的支持问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。