31. Unity 异步加载的底层细节

1.Unity 异步加载的底层细节


1.Unity 异步加载的底层细节

csharp 复制代码
1).发起异步加载, 你调用LoadAssetAsync, Unity引擎(C++ 层)接收到请求, 拆分任务

a.读取文件: IO密集型(从硬盘读AB包的二进制数据)

b."解压/解析": CPU密集型(解压压缩的图片, 解析为Unity的Sprite对象)
csharp 复制代码
2).处理IO任务	

a.Unity引擎把"读取文件"的IO请求交给 Windows/macOS 的内核, 通过IOCP(Windows)/kqueue(macOS)注册异步IO	

b.操作系统把IO请求加入队列, CPU释放, 硬盘开始读取数据

c.读取完成后, 操作系统通过硬件中断通知CPU: "这个IO任务做完"

d.CPU响应中断, 操作系统把"IO完成"的结果写入IOCP完成队列
csharp 复制代码
3).处理CPU任务	

Unity的后台线程池监控到IO完成后, 取出读取到的二进制数据, 执行"解压/解析", 比如把PNG二进制解压为纹理数据, 后台

线程占用CPU核心执行解压计算, 此时主线程仍在执行Update/UI渲染, 互不阻塞
csharp 复制代码
4).回调切回主线程	

后台线程完成解压/解析后, Unity引擎把"加载完成的回调"加入主线程的执行队列
csharp 复制代码
5).执行回调	

主线程下一帧执行队列中的回调代码, 你可以安全操作UI/游戏对象

csharp 复制代码
a.操作系统中断/IOCP的作用: "解决IO等待问题"

- 读取文件时, 硬盘的读写速度远慢于CPU, 如果让线程傻等(同步IO), 会浪费CPU资源

- 操作系统的中断/IOCP机制, 本质是"硬盘读完后主动通知CPU", 而非CPU轮询询问, 这一步不需要线程持续占用

b.Unity后台线程的作用: "解决CPU密集任务问题"

- 资源文件(尤其是AB 包)大多是压缩的(如: LZ4/LZMA), 读取后的二进制数据需要解压, 解析为Unity能识别的对象, 比如

Texture2D、Sprite

- 解压是纯CPU计算, 必须有线程来执行(总不能让主线程干这个, 否则会卡顿), 因此Unity会把这个任务交给后台线程池

- 这一步是"真的占用CPU核心干活", 必须有线程, 操作系统中断管不了"解压计算", 只能管"IO完成通知"
相关推荐
zhchyun20082 天前
# 【Unity UI 进阶】仿 Element UI 打造企业级 Unity UI 组件库(06)
ui·unity·游戏引擎
Behaviour2 天前
Unity游戏HybridCLR 热更新接入实战
游戏·unity·游戏引擎
LONGZETECH2 天前
新能源汽车动力电池实训教学痛点与虚拟仿真技术解决方案
c语言·3d·unity·架构·汽车·汽车教学软件
王维志2 天前
UiSplineRenderer
unity·游戏引擎
FairGuard手游加固3 天前
iOS 游戏加固技术解析:代码混淆、资源加密、内存保护与重签名检测
安全·游戏·macos·unity·ios·objective-c
UWA4 天前
GPM 2.0 WebGL 监测能力扩容|覆盖 Unity/Cocos/LayaAir 多引擎微信 & 抖音小游戏
unity·微信·性能优化·小游戏·webgl
Behaviour4 天前
Unity 手游网络同步技术
网络·unity·c#·游戏引擎
niuniudengdeng4 天前
Unity手游APK去广告实战:华为渠道包反编译、广告拦截与“网络不佳“弹窗修复全记录
unity·游戏引擎
Behaviour4 天前
Unity UI循环列表UIScrollViewContent实现
ui·unity·c#·游戏引擎
_ZHOURUI_H_5 天前
Unity EasyECS:并不是所有字段都适合 SoA,Unity 项目中应该怎样拆数据
游戏·unity·性能优化·架构·游戏引擎