目录
一、资源加载种类
二、AssetBundle使用
三、大世界实现方案
四、大世界优化
一、资源加载种类
1.Resource.Load() Resource.Load是Unity加载Resources文件夹的加载方式,Resources文件夹会随着打包一起被打到游戏包内。
2.UnityEditor.AssetDatabase.LoadAssetAtPath() Editor下的加载方式,加载路径是项目下的路径,除了Resources文件夹都不会随着打包打到游戏本体内。
3.AssetBundle.Load() 加载Asset Bundle,SteamingAsset(可读写)可以用于热更资源。
二、AssetBundle说明
镜像文件和Asset以及GameObject的关系
Unload(true)卸载Asset会让场景中的GameObject也丢失
二、AB使用流程
1.设计AB
2.Build AB 和 上传
3.加载Load
4.cache
5.实例化Instantiate
1.设计AssetBundle包
应用:
RedirectRes每个资源打成一个Asset 其他按照一定策略打包 一个主题多张贴图打成一张贴图 主题包括其他主题的情况。
2.Build AssetBundles及上传
使用接口BuildPipeline.BuildAssetBundles()
3.同步加载
4.AB异步加载
目的:缓解同步加载卡顿 项目接口:ResourceMgr.LoadAsync(path,callback) 注意事项:①无callback不会增加引用次数 ②异步的时候同步加载会造成冲突
5.Cache
cache了加载好的Obj,用于下次调用返回
每次调用进行了计数+1
调用Unload可以-1
6.卸载AB
如何卸载:当asset引用为0 调用UnloadUnuseAssets 下次GC便会清除
目的: 游戏内容多,导致内存过大 原本只在切换场景的时候才会清空cache和UnloadUnuse
过程: UnloadAB→调用UnloadUnUseAssets→GC
三、大世界实现方案
实现核心:拼接、门连通
四、大世界优化
1.加载卡顿
2.实例化卡顿
3.加载与实例化卡顿处理
4.内存
5.脚本
6.shader预加载
7.UI合批
8.恶性GC
9.资源太大
1.加载卡顿 - 同步加载
问题: 使用同步加载顿卡严重
解决: 分帧加载
问题: 持续小卡顿
解决: 做了异步加载
1.加载卡顿 - 异步加载
使用异步加载 ①加载开始瞬间gc.alloc很高(高峰有1w次左右)
问题:资源大、依赖多、代码构造函数申请多
②异步LockPersistenManger
2.实例化卡顿 - 分析
测试方法: stopwatch/profiler.takesample
测试对象: Node 怪物
3.卡顿处理
①Node拆分处理
Logic:只有碰撞的scene和wall Machine:机关,包括传送门和NPC和破碎物
RenderNode:只有场景 →RenderPart(美术需求周目变化) →未来更细的拆分,或者使用池复用
②加载策略
同步加载:LogicNode
异步加载:RenderNode、RenderPart、MachineNode、怪物、NPC
分帧加载/删除:Node三部分、NPC、怪物
预加载:Node、1个地图传送、2个点对点传送
③使用池:传送门、怪物、特效
4.内存问题 - 分析
问题: 除了切换场景,不会释放ab和asset, 导致大世界在多次传送后内存高 情况二:加载了保持引用
解决: 调用unload(true) 当asset没有引用时调用unloadunuse
4.内存问题
内存泄漏: ①加载了,不使用却保持引用 ②Load/LoadAsync会使次数+1 unload的次数比load少
解决方向: 上层池管理,底层只负责unload
5.脚本问题
6.Shader预加载
问题: Shader的问题居多 第一次加载和WarmUp总是卡
解决: ShaderVariantCollection
7.UI合批
8.恶性GC
①不要在TriggerStay/Update内获取Lua数据和GetComponent
⑤频繁new变量、装拆箱
9.资源太大
------------------------------------------------
end