[CPU] 减少ILRuntime内的Update
受限于ILRuntime的运行效率,不建议在ILRuntime中进行大量的Update运算。如果项目需要,也应首先考虑将性能热点代码尽量放在主工程内,由ILRuntime调用主工程内的代码。
[CPU] 减少主工程对ILRuntime内方法的调用数量
这一点在Update上较明显。如果ILRuntime中有大量Update且分散在项目内各处由主工程调用,可以考虑将ILRuntime中所有的Update方法集中在一处,然后由主工程统一调用,可带来客观的性能收益(主要体现在CPU上)。
[GC] 尽量避免ILRuntime中持有主工程内的值类型
以Unity的Vector3举例,当ILRuntime中的某个类的实例持有Vector3的变量,那么当修改这个变量时,IL代码调用的是stfld
指令,该指令在ILInterpreter中解析时会直接调用值绑定中的AssignFromStack
方法,并在保存时产生装箱,将Vector3转换为object存入managedObjs
数组。
[GC] ILRuntime尽量不要调用主工程内参数是枚举的方法
当ILRuntime调用此类方法时,传入的参数虽然是枚举,是值类型,但是我们生成的绑定代码会在内部将该枚举值进行装箱,产生GC
[GC] ILRuntime中不要用Dictionary去循环
在ILRuntime中对Dictionary循环会产生大量GC,因为它的循环需要使用Enumerator,且对它的调用都会在绑定代码中产生大量GC。如果这个循环放到了Update中,那将是灾难性的
[GC] ILRuntime中的循环不要使用foreach
使用foreach对以List、Dictionary这些实现了IEnumerable的类进行的遍历操作,在原生的C#中也会产生GC,而ILRuntime中这些操作的GC会被放大,所以最好不要使用foreach进行循环,可以使用for。Dictionary建议如上一条,不要遍历,如有需要可考虑是否有折中的办法
网友评论