性能优化-资源管理


#资源类型

fbx 模型动画文件
prefab 预制体,关联文件
asset 自定义文件,AMTake
anim 动画文件
mat 材质球
tga 贴图
png 图片,ui
jpg 少量ui大图用
spriteatlas 图集文件
ogg 音效
unity 场景文件
exr 光照贴图文件
mp3 背景音乐
mp4 mov
ttf 字体
fnt 自定义字体文件
fontsettings 字体配置文件
shader 着色器文件
bytes txt文件
lua 代码文件
cs c#代码文件

#资源加载加载接口

  1. local guid = DKAssetManager:getInstance():Load*Async( )
  2. local asset, guid = DKAssetManager:getInstance():Load*Sync( )
  3. DKAssetManager:getInstance( ):UnloadGuid( guid )

#资源加载流程

ab模式模拟模式DkLayer:SetImageDKAssetManager:LoadAtlasAsyncDKAssetManager:LoadObjectAsyncAsyncLoadManager:LoadAssetAsyncResourceManager.LoadAssetAsyncAssetBundleManager.LoadAsyncAssetBundleManager:AssetBundleLoadAssetOperation.InitAssetBundleManager:AssetBundleLoadAssetOperationSimulation.InitAssetBundle.LoadAssetAsyncAssetDatabase.LoadAssetAtPathAssetBundleManager.UpdateAssetBundleLoadAssetOperationFull.UpdateResourcemanager.LoadAsyncAsyncLoadManager:OnLoadDKAssetManager:OnLoadDkLayer:Callback

#资源卸载流程

模拟模式ab模式DkLayer:DisposeDKAssetManager:UnloadGuidDKAssetManager:DescRefResourceManager.UnloadAssetAssetBundleManager.UnloadAssetnothingAssetBundleManager.UnloadAssetBundleAssetBundle.Unload

#引用计数

  1. Asset引用计数 DKAssetManager.AddRef DKAssetManager.DescRef
  2. AssetBundle引用计数 m_LoadedAssetBundles/LoadedAssetBundle.m_ReferenceCount

#打包

##原则:

相同生命周期的资源打在一起

##打包流程

核心:abtools.cs AnalyseDependencies

获取直接加载资源 collectsrcfiles获取所有ab需要的资源 collectabfiles移除子资源 removesubprefab根据依赖计算哪些资源打1个ab genabnames

##依赖情况

1A只被某资源B依赖,A要被打进B所以在的bundle
2C,D同时只被A,B依赖,且A,B不在一个bundle,C,D在一个bundle

考虑

资源A资源B资源C资源D

C,D生命周期一致,按照原则是要打进一个ab,是怎么做到的?

#问题

  1. 同步异步会用,冲突的时候,会有效率丢失
  2. 不支持下载
  3. 不支持外部资源
  4. 返回guid的方式,没有办法给出泄漏的 引用路径

#提问

  1. 异步加载没完成被移除,怎么处理 ?
    答:分2种情况:
    一. 实际没有加载,还在asyncloadmanager的队列,直接从队列里去掉
    二. 已经实际开始加载了(调用assetbundlemanager.loadasyc),等资源加载完,发现不再需要,直接卸载

  2. 有重复依赖资源的时候,怎么判定生命周期?
    答:参见genabnames实现

  3. 打包AB 第二个步骤,获取所有资源。所有资源包括什么?
    答:根据needpack获取直接加载资源,再根据assetdatabase.GetDependencies获取依赖的资源,他们的合集就是所有资源

  4. 可不可以按目录打AB?
    答:根据目录打ab不是一个好的策略,有3个缺陷:
    一. 生命周期和目录不完全对应,导致实际运行时,ab不能及时卸载,导致内存增加
    二. 有些依赖关系只能通过配置表来获得,目录就会缺失这部分信息
    三. 有部分资源,比如特效,目录结构就是乱的,全放一起的

  5. AB结果持久化,保存在本地,加快之后增量AB的速度,能不能这么搞?
    答: 有2个问题:
    1.根据修改资源获取影响资源,这个本身也是复杂的计算
    2.增加了打包复杂程度,更不维护了

  6. removesub时的循环依赖,间接循环依赖怎么处理?
    答:1.获取依赖的时候,都是GetDependencies(true),所以根上规避了间接依赖。
    2.循环依赖的资源,GetDependencies必然是一样的结果,remoesub的时候,都会保留下来,到genabnames时,会被计算进同一个ab

posted on 2020-01-07 14:51  marcher  阅读(265)  评论(0编辑  收藏  举报

导航