性能优化-资源自省
版本记录
日期 | 版本 | 说明 | 作者 |
---|---|---|---|
2018-7-22 | 1.0 | 资源泄漏 | 李俊 |
问题判断
通过unity 资源占用初略判断, 250M以下, 泄漏几率很小 300M以下, 没有大量泄漏
问题分割
游戏从热更开始,找到1个点,这个点满足能反复到达,dk找的是刚进游戏
刚进游戏前资源问题
人工方式确定在profile里每个资源合理性
刚进游戏后资源问题
对比第一次达到这个点,和长时间游戏后,再次到达这个点,资源差异。差异部分 >= 泄漏部分
- 有办法找出差异部分
- 差异部分需要足够的信息,去解决资源泄漏
现状
ResouceManager.LoadSync( assetName , type )
ResouceManager.LoadAsync( assetName , type, callback )
ResouceManager.UnloadAsset( assetName )
接口本身是不合理的,错误的地方在于:
- UnloadAsset没有办法正确调用
- 异步没有办法正确处理
新接口
DKAssetManager.LoadObjectAsync( assetName , type )
DKAssetManager.LoadObjectSync( assetName , type, callback )
DKAssetManager.UnloadGuid( guid )
泄漏检测工具
DKAssetManager.SnapShot DKAssetManager.CompareSnapShot
差异部分是精细到每次加载
泄漏解决
可以获得泄漏资源的加载traceback
泄漏查找和开发是并行的,不止要解决眼前的,而且还要能预防未来
框架中释放资源
DKLayer.SetImage
DKLayer.LoadPrefab
问题
- 解决不了资源没有及时释放
- 进游戏前需要人工排查,存在风险,资源过多,人工无法排查
- 两次snapshot对比,合理存在的差异资源
- 泄漏只能到资源层面,到不了对象层面
- 内存产生的资源对象,是无法查到, 比如RT
- 没达到所有资源都在框架释放
提问
-
ResourceManager在c#里实现,DKAssetManager为啥在lua实现?
答:最主要的原因是,lua里获取traceback容易,其次如果c#,lua实现都可以的时候,是倾向于lua实现,以后扩展修复bug都方便 -
mipmap为啥能解决噪点?
答:噪点的产生是一个像素点颜色不停的突变。是由于顶点uv插值,导致像素的uv在波动,如果图片过大,波动就会跨越好几个像素点,导致颜色差异过大,使用了mipmap,减少了贴图尺寸,波动跨越的像素点变小,从而消灭了噪点。