性能优化-资源自省

版本记录

日期版本说明作者
2018-7-22 1.0 资源泄漏 李俊

问题判断


通过unity 资源占用初略判断, 250M以下, 泄漏几率很小 300M以下, 没有大量泄漏

问题分割


游戏从热更开始,找到1个点,这个点满足能反复到达,dk找的是刚进游戏

刚进游戏前资源问题


人工方式确定在profile里每个资源合理性

刚进游戏后资源问题


对比第一次达到这个点,和长时间游戏后,再次到达这个点,资源差异。差异部分 >= 泄漏部分

  1. 有办法找出差异部分
  2. 差异部分需要足够的信息,去解决资源泄漏

现状


ResouceManager.LoadSync( assetName , type )
ResouceManager.LoadAsync( assetName , type, callback )
ResouceManager.UnloadAsset( assetName )

接口本身是不合理的,错误的地方在于:

  1. UnloadAsset没有办法正确调用
  2. 异步没有办法正确处理

新接口


DKAssetManager.LoadObjectAsync( assetName , type )
DKAssetManager.LoadObjectSync( assetName , type, callback )
DKAssetManager.UnloadGuid( guid )

泄漏检测工具


DKAssetManager.SnapShot DKAssetManager.CompareSnapShot

差异部分是精细到每次加载

泄漏解决


可以获得泄漏资源的加载traceback
泄漏查找和开发是并行的,不止要解决眼前的,而且还要能预防未来 框架中释放资源
DKLayer.SetImage
DKLayer.LoadPrefab

问题


  1. 解决不了资源没有及时释放
  2. 进游戏前需要人工排查,存在风险,资源过多,人工无法排查
  3. 两次snapshot对比,合理存在的差异资源
  4. 泄漏只能到资源层面,到不了对象层面
  5. 内存产生的资源对象,是无法查到, 比如RT
  6. 没达到所有资源都在框架释放

提问


    1. ResourceManager在c#里实现,DKAssetManager为啥在lua实现?
      答:最主要的原因是,lua里获取traceback容易,其次如果c#,lua实现都可以的时候,是倾向于lua实现,以后扩展修复bug都方便

    2. mipmap为啥能解决噪点?
      答:噪点的产生是一个像素点颜色不停的突变。是由于顶点uv插值,导致像素的uv在波动,如果图片过大,波动就会跨越好几个像素点,导致颜色差异过大,使用了mipmap,减少了贴图尺寸,波动跨越的像素点变小,从而消灭了噪点。

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

导航