赞
踩
本文主要针对一些常见的性能优化的点进行总结。属于一个high level的overview。需要注意只有当这些模块确定成为制约帧时间的瓶颈时,才能够进行针对性地优化,否则可能会适得其反,事倍功半。
一般来说,移动端性能优化,如果同时支持ios和android,建议先从ios开始优化,因为ios的工具链更加强大一些。先做共性的性能优化,在做兼容性方面的性能优化。
有时候一个性能消耗巨大的步骤会对前后的步骤造成阻塞影响。举个例子时,一辆卡车只能装载30吨的货物,如果货物一共有50吨时就需要运载2次,当优化到30吨时会带来巨大的提升。如果一次运输超过了带宽的大小,那么就要分2次运输,如果一次渲染的填充率不足以填满render target,那么就需要填充两次。所以降采样有时候能够带来巨大的收益,不局限于其本身的耗时。
发热过大会导致SOC温度过高,最后降频,降低性能。
SOC运行在一个较高的频率会增加发热和功耗,发热多了就降频。功耗高了掉电就快,因此最好能够将CPU的负载控制在一个合理的区间,并不只是在帧时间上进行优化。
性能测试定位瓶颈的方法一般都是各种各样的控制变量。很多时候基本都是通过排列组合,一遍遍试才能真正确定的。特别注意优化需要建立在问题已经被定位到的基础上。
通过profiler能够一定程度上来确定瓶颈在哪,当然不能单一地只看profiler,需要结合其他分析工具,因为profile有时候非常不准。需要注意的是profiler最好运用在目标平台上,例如adb连接安卓设备,mac上连接苹果设备等。
profiler和集成的uwa可大致判断函数的消耗,在PC上确定移动端的瓶颈可以通过限制PC上的核心频率和线程数来模拟。
profiler和xcode可大致判断,观察一帧时间分布,例如CPU多少毫秒,GPU花了多少毫秒,unity profiler中cpu是否有wait for gfx之类的函数。
尝试加减几何体或增减顶点数。
增减分辨率
采样一个虚假的极小的贴图可以屏蔽带宽的因素等等
无法衡量的功能消耗的情况:我们可以通过控制变量计算出大致的消耗,比如打不同版本的包横向对比、在屏幕上使用按钮做功能的开关、使用lua配置等方法开关。
开关特性、设置打包对比
如果确定是CPU的瓶颈,以下几个模块是当这些功能成为性能开销较大的模块时的优化方向
draw call是造成cpu瓶颈的因素之一,如果draw call过多,cpu会消耗大量的时候在应用阶段准备渲染所需的数据以及设置渲染的状态等。因此可以通过以下几个合批手段来进行优化
srp batcher主要用来降低set pass call。使用时需要注意其限制
限制:
暂略。
将需要传输的数据一次性传输,节约CPU向GPU传递渲染所需资源的次数。
在SRP batcher中不兼容,需要手动写代码调用如下三个Api:
UGUI中的UI造成的CPU开销主要来自于canvas re-batch时间过长。每一个canvas在绘制之前都有进行合批。如果UI不变则不需要重新合批。re-batch一般在线程中进行,移动端核心数的不同影响实际性能。造成re-batch的主要有以下几种情况:
以下主要针对内存瓶颈的优化。
一个shader的变体太多会加载太多这个shader的版本造成大量的内存开销。
根据场景有时static batching会造成额外的内存开销。需要注意甄别。
GPU瓶颈是一个技术含量较高的领域,要做好这里的优化需要专业的引擎、图程或TA人员。因为优化渲染性能的同时还要保证效果和兼容性绝对不是一个简单的任务。
Lod shader通常比lod 模型更重要,因为中高端机的顶点瓶颈的可能性很小。
对于移动较少的场景,可以通过渲染到图片的假背景进行优化,例如暂停界面的模糊场景背景等,人物展示界面静止的背景等。
比如在特定场合做低于设计帧数的更新,例如UI弹出时等情况。
尽量不使用双面渲染
提前深度测试来剔除不必要的片元开销。
根据摄像机的视椎体来对物体进行裁剪,unity默认有
烘焙遮挡剔除数据。带来内存开销。
Octree, BSP Tree, Portal, Voxelization
Hi-Z, temporal reprojection culling, cluster, tiled-based visibility buffer
使用TBDR CBDR forward+等架构剔除冗余光源计算,推迟光照计算到管线的最后一步
尽量减少透贴效果的使用。
带宽,在移动端,bandwith是一个多种设备(cpu gpu audio等)共享的资源,而且处理器通过带宽对存储的访问是一个很耗电的操作,所以,尽可能的提高在gpu内部cache上访问的到的可能性,减少对内存访问。无论是对代码的cache,贴图的压缩,mimapmap都是在做这种努力
shader中的每句语句的开销可以通过新版xcode来检查。
一般来说,渲染特性的优化主要以下几个手段:
使用单pass翻转矩阵平面反射,避免镜头方案的使用
在前向渲染中,MSAA>FXAA>TAA>SMAA
在延迟渲染中,FXAA>TAA>>SMAA
后期效果往往涉及全屏的blit,尤其复杂的效果涉及步进等计算,在移动端更是灾难。
一般而言不论是何种后期,最好都有以下的优化手段:
color grading的dynamic range在支持浮点精度纹理的设备上使用high会更高效
尽量使用gaussian模式
occlusion设置与光晕数量。
https://space.bilibili.com/1311706157/video
https://cdn2-unrealengine-1251447533.file.myqcloud.com/Resources/files/GDC2014_Next_Generation_Mobile_Rendering-2033767592.pdf
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。