为什么使用IL2CPP后端构建会导致Unity中的APK更大

Md *_*ani 2 unity-game-engine

我正在将Unity 2018.2.3与.Net 4.6脚本运行时一起使用。
我有两场比赛。当我使用IL2CPP后端构建时,apk大小始终大于Mono后端。

第一场比赛:
单声道的APK大小:12.9 MB
IL2CPP的APK大小:13.7 MB

第二局:
Mono的APK大小:39 MB
IL2CPP的APK大小:45 MB

为什么会这样呢?

Jos*_*son 5

发生这种情况有几个原因。

首先,使用Mono的Android版本会在APK中交付托管程序集。这些程序集会及时编译为Android设备上的机器代码。另一方面,IL2CPP提前将托管程序集编译为机器代码,并将机器代码发送到APK中。这些受管程序集中的IL字节代码比机器代码更紧凑,这有两个原因:

  1. JIT仅将实际执行的托管代码转换为机器代码。IL2CPP必须将其全部转换。
  2. 泛型需要提前全部扩展。IL2CPP可以共享某些通用实现,但不能共享所有(特别是不能共享带有值类型参数的通用实现)。JIT仅在使用通用实现时生成它们。

其次,默认情况下,Unity为带有IL2CPP的ARMv7和x86架构生成机器代码。由于IL2CPP需要提前生成该代码,因此重复了第一点提到的所有较大代码的问题。例如,如果不需要支持x86,则可以修改播放器设置以避免构建它。