有一点是我们考虑的前提,规范和标准,我们根据产品指标做出对应的数据标准,只有在这个前提下才能达到产品预期,同时只有在一套商定的标准下各个部门才能有效配合。所以我们会根据方向的几点,推导出符合自己产品定位的标准。
所以首先我们需要制定资源规范,制定规范需考虑当前市场的手机芯片市场占用情况(芯片调查);以及该芯片在运行情况下能够达到的参数(芯片运行参数),通过这些数据结合自身游戏的特性给出资源的制作标准。当前我们也已经得到了适合自己的参数,和一些得到这些参数的途径:
1)确认游戏风格,找到参考游戏分析资源和各个机型的支持情况,确定场景运行的总面数,DrawCall次数等信息
http://qiankanglai.me/2015/05/16/Adreno-Profiler/index.html
http://blog.csdn.net/daijy0111/article/details/50427758
https://zhuanlan.zhihu.com/p/26215257
https://zhuanlan.zhihu.com/p/27696865
2)抓取资源可能会遇到的问题(其实我们用Snapdragon Profiler没遇到下面问题)
3)高通有两款性能分析工具,还有一款是Snapdragon Profiler 下面给一个使用文档
https://blog.csdn.net/msf568834002/article/details/77677474
但如果要导出模型也可以采用Intel的gpa,但模型没有UV信息,下面再贴一个链接
通过调研我们除了资源规范,还得到很多数据比如(当期那市场占有率第二高通650的一些流畅保障的程序运行信息)
用的比较多的是第三方工具UWA测试的报告,GOT工具(和用户反馈),当然我们自己也会随时开启unity自带的profiler。
1)UWA做了预期指标,以兼容中低端手机为目标,稳定在30帧,长时间不发热,给出了两份数据参考
2)指标要求,并给出了一些优化建议(在后面“优化建议”目录中)
1)GPU一般具有填充率(Fillrate)和内存带宽(Memory Bandwidth)的限制,如果你的游戏在低质量表现的情况下会快很多,那么,你很可能需要限制你在GPU的填充率。
2)CPU一般被所需要渲染物体的个数限制,CPU给GPU发送渲染物体命令叫做DrawCalls。一般来说DrawCalls数量是需要控制的,在能表现效果的前提下越少越好。通常来说,电脑平台上DrawCalls几千个之内,移动平台上DrawCalls几百个之内。
(来一个数据:高通650芯片,18年市场占有率第二,为流畅保障每帧定点<10W,DrawCalls<200)
CPU中的计算主要是在蒙皮骨骼计算,布料模拟,顶点动画,粒子模拟等。GPU则在各种顶点变换、光照、贴图混合等。
1)需要注意的是有些(built-in)Shader是有mobile版本的,这些大大提高了顶点处理的性能。当然也会有一些限制。
2)自己写的shader请注意复杂操作符计算,类似pow,exp,log,cos,sin,tan等都是很耗时的计算,最多只用一次在每个像素点的计算。不推荐你自己写normalize,dot,inversesqart操作符,内置的肯定比你写的好。
3)需要警醒的是alpha test,这个非常耗时。
4)浮点类型运算:精度越低的浮点计算越快。
http://docs.unity3d.com/Documentation/Components/SL-ShaderPerformance.html
1)内存看起来高,因为Unity是跑在mono虚拟机上的程序,通过C#申请内存,Mono会GC程序申请的内存,但内存不会归还系统;
所以可能造成实际使用内存和程序占用内存不符的情况,解决方案(网上搜索一下各种缓存池)。
2)内存过多占用,这种通常是资源和对象管理不合理,比如资源Sharder编译多个分支部分不用的就浪费了空间,比如需要手动GC的没做到位(Combined Mesh)如下图实际使用297,但总共却又10.2k。
![]() |
![]() |
1)引起Canvas对网格的重建大概有几种情况Image,Text等UI元素的Enable及UI元素的长、宽或Color属性的变化等。因此在一些较复杂的界面,可以多分几个Canvas出来,虽然会增加drawcall,但是减少了网格重建时间,让性能有更好的提升。
2)摇杆区,技能区,血条,经验条是比较容易变化的,把这些都放到一个叫Dynamic的节点,并有自己的canvas,这样在他们频繁变化时,也只需要对这小部分进行网格重建,相对于整个MainUI重建的开销就小非常多了。
1)若不用光肯定是最快的。移动端优化可以采用用光照贴图(Lightmapping)去烘培一个静态的贴图,以代替每次的光照计算,在U3D中只需要非常短的时间则能生成。这个方法能大大提高效率,而且有着更好的表现效果(平滑过渡处理,还有附加阴影等)。
2)自动和并考虑和静态批处理(Batching Static网上文章较多)
3)相机后期处理,可以考虑分级处理高端机使用
4)高低模切换,远景视距模型切换,还有很多可动态调整增强性能的保障
1)分辨率、高低模、阴影效果、环境光