HybridCLR使用泛型
作者:追风剑情 发布于:2026-1-26 16:39 分类:Unity3d
一、什么时候可直接热更泛型代码?
当 AOT 代码中已经使用过某泛型声明时,热更DLL中可以直接使用这种泛型代码。例如,当 AOT 代码中已经使用过 List<float> 时,在热更代码中才能使用 List<float> 泛型,否则会报错。
我们用上一章节使用过的测试用例来验证这一点。
using UnityEngine;
public class Hello
{
public static void Run()
{
Debug.Log("Hello, World");
}
}
运行测试
修改测试用例
using System.Collections.Generic;
using UnityEngine;
public class Hello
{
public static void Run()
{
Debug.Log("Hello, World");
var arr = new List<float>();
arr.Add(2.0f);
}
}
执行菜单:【HybridCLR】->CompileDll->ActiveBuildTarget 重新生成热更DLL,并替换掉发布程序中的 HotUpdate.dll.bytes 文件。
再次运行测试
从下图中的报错信息可以看出,当 AOT 代码中没使用过 List<float> 时,热更代码使用了 List<float> 会引起报错。这是因为 AOT 在编译时未记录 List<float> 的元数据导致。
二、补充元数据
执行菜单 【HybridCLR】->Generate->AOTDlls 重新生成包含元数据的 AOT DLL。
重新生成的 AOT DLL 自动保存在 {工程路径}\HybridCLRData\AssembliesPostIl2CppStrip\{平台目录} 下面。
将 mscorlib.dll 改名为 mscorlib.dll.bytes 并拷贝到发布程序的 StreamingAssets 下面,如图:
mscorlib.dll.bytes 也需要动态加载,我们接下来对上一章节中的用例代码进行修改。
using System;
using System.Reflection;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEngine;
using HybridCLR;
public class LoadDll : MonoBehaviour
{
void Start()
{
// 先补充元数据
LoadMetadataForAOTAssemblies();
// Editor环境下,HotUpdate.dll.bytes已经被自动加载,不需要加载,重复加载反而会出问题。
#if !UNITY_EDITOR
Assembly hotUpdateAss = Assembly.Load(File.ReadAllBytes($"{Application.streamingAssetsPath}/HotUpdate.dll.bytes"));
#else
// Editor下无需加载,直接查找获得HotUpdate程序集
Assembly hotUpdateAss = System.AppDomain.CurrentDomain.GetAssemblies().First(a => a.GetName().Name == "HotUpdate");
#endif
Type type = hotUpdateAss.GetType("Hello");
type.GetMethod("Run").Invoke(null, null);
}
private static void LoadMetadataForAOTAssemblies()
{
List<string> aotDllList = new List<string>
{
"mscorlib.dll",
"System.dll",
//如果使用了Linq,需要这个
"System.Core.dll",
//"Newtonsoft.Json.dll",
//"protobuf-net.dll",
};
foreach (var aotDllName in aotDllList)
{
string filePath = $"{Application.streamingAssetsPath}/{aotDllName}.bytes";
if (!File.Exists(filePath))
continue;
byte[] dllBytes = File.ReadAllBytes(filePath);
LoadImageErrorCode err = HybridCLR.RuntimeApi.LoadMetadataForAOTAssembly(dllBytes, HomologousImageMode.SuperSet);
Debug.Log($"LoadMetadataForAOTAssembly:{aotDllName}. ret:{err}");
}
}
}
因为 LoadDll.cs 代码在 AOT 程序集中,需要重新 Build 一个包。现在热更流程变成了先加载元数据DLL,再加载需要热更的逻辑DLL。现在如果在热更代码中新增了 AOT DLL 中没使用到的泛型,只需重新生成 AOT DLL 并丢在 StreamingAssets 下,即可完成补充元数据操作。
再次运行测试。可以看到,补充了元数据后,List<float> 不再报错。
三、优化 AOT DLL 大小
通过 【HybridCLR】->Generate->AOTDlls 生成的 AOD DLL 包含了很多没用到的元数据,接下来写个自定义菜单用来剥离未使用到的元数据。
新创建个 HybridCLREditor.cs 并放到 Assets/Editor 目录下。
using System.IO;
using UnityEditor;
using HybridCLR.Editor;
using HybridCLR.Editor.AOT;
public class HybridCLREditor
{
// 进一步剔除AOT dll中非泛型函数元数据,输出到StrippedAOTAssembly2目录下
[MenuItem("HybridCLR/Strip AOT Assembly")]
public static void StripAOTAssembly()
{
BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
string srcDir = SettingsUtil.GetAssembliesPostIl2CppStripDir(target);
string dstDir = $"{SettingsUtil.HybridCLRDataDir}/StrippedAOTAssembly2/{target}";
foreach (var src in Directory.GetFiles(srcDir, "*.dll"))
{
string dllName = Path.GetFileName(src);
string dstFile = $"{dstDir}/{dllName}";
AOTAssemblyMetadataStripper.Strip(src, dstFile);
}
}
}
执行完 【HybridCLR】->Generate->AOTDlls 后,再执行 【HybridCLR】->Strip AOT Assembly 菜单,即可生成优化后的 AOT DLL。优化后的 AOT DLL 存放在 HybridCLRData\StrippedAOTAssembly2\{平台目录} 中。
查看优化前和优化后的大小差异。
优化前大小 1.66MB。
优化后大小 740KB。
四、泛型共享机制
在 “Project Settings -> Other Settings -> IL2CPP Code Generation” 中可设置泛型共享机制。
Faster runtime:标准泛型共享机制,性能高,包体大。(HybridCLR官方建议启用 Faster runtime)
Faster (smaller) builds:完全泛型共享机制,性能低,包体小。
标签: Unity3d
日历
最新文章
随机文章
热门文章
分类
存档
- 2026年1月(5)
- 2025年12月(1)
- 2025年11月(1)
- 2025年9月(3)
- 2025年7月(4)
- 2025年6月(5)
- 2025年5月(1)
- 2025年4月(5)
- 2025年3月(4)
- 2025年2月(3)
- 2025年1月(1)
- 2024年12月(5)
- 2024年11月(5)
- 2024年10月(5)
- 2024年9月(3)
- 2024年8月(3)
- 2024年7月(11)
- 2024年6月(3)
- 2024年5月(9)
- 2024年4月(10)
- 2024年3月(11)
- 2024年2月(24)
- 2024年1月(12)
- 2023年12月(3)
- 2023年11月(9)
- 2023年10月(7)
- 2023年9月(2)
- 2023年8月(7)
- 2023年7月(9)
- 2023年6月(6)
- 2023年5月(7)
- 2023年4月(11)
- 2023年3月(6)
- 2023年2月(11)
- 2023年1月(8)
- 2022年12月(2)
- 2022年11月(4)
- 2022年10月(10)
- 2022年9月(2)
- 2022年8月(13)
- 2022年7月(7)
- 2022年6月(11)
- 2022年5月(18)
- 2022年4月(29)
- 2022年3月(5)
- 2022年2月(6)
- 2022年1月(8)
- 2021年12月(5)
- 2021年11月(3)
- 2021年10月(4)
- 2021年9月(9)
- 2021年8月(14)
- 2021年7月(8)
- 2021年6月(5)
- 2021年5月(2)
- 2021年4月(3)
- 2021年3月(7)
- 2021年2月(2)
- 2021年1月(8)
- 2020年12月(7)
- 2020年11月(2)
- 2020年10月(6)
- 2020年9月(9)
- 2020年8月(10)
- 2020年7月(9)
- 2020年6月(18)
- 2020年5月(4)
- 2020年4月(25)
- 2020年3月(38)
- 2020年1月(21)
- 2019年12月(13)
- 2019年11月(29)
- 2019年10月(44)
- 2019年9月(17)
- 2019年8月(18)
- 2019年7月(25)
- 2019年6月(25)
- 2019年5月(17)
- 2019年4月(10)
- 2019年3月(36)
- 2019年2月(35)
- 2019年1月(28)
- 2018年12月(30)
- 2018年11月(22)
- 2018年10月(4)
- 2018年9月(7)
- 2018年8月(13)
- 2018年7月(13)
- 2018年6月(6)
- 2018年5月(5)
- 2018年4月(13)
- 2018年3月(5)
- 2018年2月(3)
- 2018年1月(8)
- 2017年12月(35)
- 2017年11月(17)
- 2017年10月(16)
- 2017年9月(17)
- 2017年8月(20)
- 2017年7月(34)
- 2017年6月(17)
- 2017年5月(15)
- 2017年4月(32)
- 2017年3月(8)
- 2017年2月(2)
- 2017年1月(5)
- 2016年12月(14)
- 2016年11月(26)
- 2016年10月(12)
- 2016年9月(25)
- 2016年8月(32)
- 2016年7月(14)
- 2016年6月(21)
- 2016年5月(17)
- 2016年4月(13)
- 2016年3月(8)
- 2016年2月(8)
- 2016年1月(18)
- 2015年12月(13)
- 2015年11月(15)
- 2015年10月(12)
- 2015年9月(18)
- 2015年8月(21)
- 2015年7月(35)
- 2015年6月(13)
- 2015年5月(9)
- 2015年4月(4)
- 2015年3月(5)
- 2015年2月(4)
- 2015年1月(13)
- 2014年12月(7)
- 2014年11月(5)
- 2014年10月(4)
- 2014年9月(8)
- 2014年8月(16)
- 2014年7月(26)
- 2014年6月(22)
- 2014年5月(28)
- 2014年4月(15)
友情链接
- Unity官网
- Unity圣典
- Unity在线手册
- Unity中文手册(圣典)
- Unity官方中文论坛
- Unity游戏蛮牛用户文档
- Unity下载存档
- Unity引擎源码下载
- Unity服务
- Unity Ads
- wiki.unity3d
- Visual Studio Code官网
- SenseAR开发文档
- MSDN
- C# 参考
- C# 编程指南
- .NET Framework类库
- .NET 文档
- .NET 开发
- WPF官方文档
- uLua
- xLua
- SharpZipLib
- Protobuf-net
- Protobuf.js
- OpenSSL
- OPEN CASCADE
- JSON
- MessagePack
- C在线工具
- 游戏蛮牛
- GreenVPN
- 聚合数据
- 热云
- 融云
- 腾讯云
- 腾讯开放平台
- 腾讯游戏服务
- 腾讯游戏开发者平台
- 腾讯课堂
- 微信开放平台
- 腾讯实时音视频
- 腾讯即时通信IM
- 微信公众平台技术文档
- 白鹭引擎官网
- 白鹭引擎开放平台
- 白鹭引擎开发文档
- FairyGUI编辑器
- PureMVC-TypeScript
- 讯飞开放平台
- 亲加通讯云
- Cygwin
- Mono开发者联盟
- Scut游戏服务器引擎
- KBEngine游戏服务器引擎
- Photon游戏服务器引擎
- 码云
- SharpSvn
- 腾讯bugly
- 4399原创平台
- 开源中国
- Firebase
- Firebase-Admob-Unity
- google-services-unity
- Firebase SDK for Unity
- Google-Firebase-SDK
- AppsFlyer SDK
- android-repository
- CQASO
- Facebook开发者平台
- gradle下载
- GradleBuildTool下载
- Android Developers
- Google中国开发者
- AndroidDevTools
- Android社区
- Android开发工具
- Google Play Games Services
- Google商店
- Google APIs for Android
- 金钱豹VPN
- TouchSense SDK
- MakeHuman
- Online RSA Key Converter
- Windows UWP应用
- Visual Studio For Unity
- Open CASCADE Technology
- 慕课网
- 阿里云服务器ECS
- 在线免费文字转语音系统
- AI Studio
- 网云穿
- 百度网盘开放平台
- 迅捷画图
- 菜鸟工具
- [CSDN] 程序员研修院
- 华为人脸识别
- 百度AR导航导览SDK
- 海康威视官网
- 海康开放平台
- 海康SDK下载
- git download
- Open CASCADE
- CascadeStudio
交流QQ群
-
Flash游戏设计: 86184192
Unity游戏设计: 171855449
游戏设计订阅号

















