跳到主要内容

完全泛型共享

补充元数据虽然彻底解决了AOT泛型问题,但补充元数据会导致需要随包携带或者热更新下载补充元数据dll,导致包体增大或者增加了热更新时间。 加载补充元数据不仅导致内存占用明显增加,还增加了启动时间。对于微信小游戏这些对包体和内存要求严苛的场合,这是一个影响较大的问题。 另外,被补充的泛型函数以解释方式执行,还降低了运行性能。

HybridCLR支持full genric sharing后,不再需要补充元数据,简化了工作流,较好地解决了补充元数据的以上缺点。

支持的版本

支持 Unity 2021及更高的LTS版本。

原理

旧的泛型共享技术只能对class类型进行泛型共享。自2021.3.x LTS版本起,il2cpp已经支持完全泛型共享(full generic sharing)技术, 即泛型参数无论是任何类型(包含值类型)都可以共享。HybridCLR利用这个机制实现了不需要补充元数据,也可以完美支持AOT泛型。

设置

危险

faster (smaller build)会对泛型函数性能有较大影响(15%甚至更高),因此建议不要开启这个选项。

如果是2021版本并且没有内存压力的情况下,建议仍然使用补充元技术来解决泛型问题。

  • 2020版本不支持完全泛型共享
  • 2021版本需要设置 IL2CPP Code Generation选项为faster(smaller build)
  • 2022版本默认开启完全泛型共享,无法关闭。如果设置 IL2CPP Code Generation选项为faster(smaller build)则能进一步减少包体。