性能优化(35)——项目设置与内存优化


 

Texture2D纹理资源类型进一步优化

  • 当场景中所有使用的纹理都开启了MipMap模式,这样我们可以通过Quality Setting中的Texture Quality选项来强制使用某一级别的MipMap Level Texture进行渲染,这样实际被加载到显存中的纹理,只有这一级Mipmap及其以下级别的纹理,占用的显存也会相对更少

  • 目前Unity只提供第0、1、2、3级的Mipmap设置,实际对应原尺寸、1/2、大小、1/4大小、1/8大小的纹理
  • 但这种方式需要在纹理加载前确定设置,因此每次修改想要设置生效,只有重启游戏才能生效
  • 比较适合高中低端机型比较明确的情况

  • 我们还可以利用Unity提供的Mipmap Streaming功能来做运行时动态调整
  • 除需要对应纹理开启Mipmap导入设置的同时,还需要将纹理导入设置的Streaming Mipmap功能选项打开,同时开启Quality Settings中的Texture Streaming功能选项
  • 该功能会强制Unity仅加载渲染当前相机所需级别的Mipmap层级,使用少量CPU资源来节省大量GPU上的内存
  • 和Texture Quality功能类似,但这个功能是运行时进行的,
  • Unity提供了该功能一系列API,让你可以为应用程序的纹理设置总内存限制,这样Unity会自动降低纹理的Mip级别,来保证纹理内存开销在预算范围内
  • 不过这个功能需要开发者非常了解其实现原理,如果只是傻瓜式开启,往往达不到优化效果,甚至设置不合理会导致画面损失较大,甚至负优化的产生


Mipmap Streaming的参数设置

  • Memory Budget:为加载纹理的总内存预算,如果大于该预算时,后续加载的纹理会采用更低级别的Mip Level。这里如果内存预算设置的太高,则起不到太多内存节省优化的作用,甚至可能造成浪费;如果设置过低,画面损失可能会比较大
  • Renderers Per Frame:为每帧CPU为Mipmap Streaming功能要处理多少个网格渲染器,虽然降低该值会减少CPU处理开销,但可能会增加加载Mipmap的延迟开销,因此需要测试平衡该值的设置
  • Max Level Reduction:代表当纹理内存达到内存预算上限时,最大可以跳过加载的Mipmap级别数,同样,设置低了会造成Mipmap加载延迟开销,设置高了会造成画面损失较大
  • Max IO Requests:是用于加载Mipmap Streaming流的最大IO请求数,如果设置得足够高,可以防止异步纹理上传阻塞。但某些系统会本身设有IO请求上限;同时设置太大,本身也会有系统的开销

  • 另外,关于相机的Mipmap Streaming设置,可以通过Streaming Controller脚本为每个相机设置不同的Mipmap级别的偏移
  • 通过给每一个纹理导入设置Mipmap Streaming优先级别,可以强制在预算内存范围内优先加载哪些纹理,以弥补整体设置激进的情况下造成的视觉损失
  • 总之,Mipmap Streaming功能几乎所有参数设置是一套多元多次多项式,随着项目规模、场景复杂度、摄像机角度变化、Mipmap纹理个数等等因素的不同,很难找到一个最优化的设置
  • 最让人难受的是,在SRP下,没有像Build-In管线下的Mipmap调试模式,这样就更难找到符合你的项目的一套最优化参数
  • 如果在SRP下使用该功能,建议为这个功能开发一套调试UI,将所有参数变量暴露到UI上,并可动态调整,然后去为你的项目每一个场景做测试调整,在视觉可接受的前提下找到一套正优化的参数,不要期望找到最优解,可以根据你具体优化的目的找到一套相对优化解就可以了