转载源:http://www.manew.com/thread-47240-1-1.htmlhtml
最近项目进入收尾阶段,以前对项目作了不少优化,mesh合并 ,减小DrawCall和模型骨骼以及物理计算,合并材质球,优化代码等等,在IOS上还好,可是上,试过几款手机,从低端到高端,发现性能仍是不好,因此又花了几天来研究摸索,终于把游戏性能搞定。记录下来,留做之后参考。
1. 更新不透明贴图的压缩格式为ETC 4bit,由于android市场的手机中的GPU有多种,每家的GPU支持不一样的压缩格式,但他们都兼容ETC格式,
2. 对于透明贴图,咱们只能选择RGBA 16bit 或者RGBA 32bit。
3. 减小FPS,在ProjectSetting-> Quality中的VSync Count 参数会影响你的FPS,EveryVBlank至关于FPS=60,EverySecondVBlank = 30;
这两种状况都不符合游戏的FPS的话,咱们须要手动调整FPS,首先关闭垂直同步这个功能,而后在代码的Awake方法里手动设置FPS(Application.targetFrameRate = 45;)
下降FPS的好处:
1)省电,减小手机发热的状况;
2)能都稳定游戏FPS,减小出现卡顿的状况。
4. 当咱们设置了FPS后,再调整下Fixed timestep这个参数,这个参数在ProjectSetting->Time中,目的是减小物理计算的次数,来提升游戏性能。
5. 尽可能少使用Update LateUpdate FixedUpdate,这样也能够提高性能和节省电量。多使用事件(不是SendMessage,使用本身写的,或者C#中的事件委托)。
6. 待机时,调整游戏的FPS为1,节省电量。
VSync Count 垂直同步
中新建一个场景空的时候,帧速率(FPS老是很低),大概在60~70之间。一直不太明白是怎么回事,如今基本上明白了。我在这里解释一下缘由,若有错误,欢迎指正。在Unity3D中当运行场景打开Profiler的时候,咱们会看到VSync 这一项占了很大的比重。这个是什么呢,这个就是垂直同步,稍后再作解释。咱们能够关闭VSync来提升帧速率,选择edit->project settings->Quality 在右侧面板中能够找到VSync Count ,把它选成Don't Sync。这就关闭了VSync(垂直同步),如今在运行场景看看,帧速率是否是提升不少。
如今来讲说什么是垂直同步,要知道什么是垂直同步,必需要先明白显示器的工做原理,显示器上的全部图像都是一线一线的扫描上去的,不管是隔行扫描仍是逐行扫描,显示器都有两种同步参数——水平同步和垂直同步。
什么叫水平同步?什么叫垂直同步?
垂直和水平是CRT中两个基本的同步信号,水平同步信号决定了CRT画出一条横越屏幕线的时间,垂直同步信号决定了CRT从屏幕顶部画到底部,再返回原始位置的时间,而偏偏是垂直同步表明着CRT显示器的刷新率水平。
为何关闭垂直同步信号会影响游戏中的FPS数值?
道理一点都不复杂,首先咱们平时运行操做系统通常屏幕刷新率是多少?大概通常都是在85上下吧,那么显卡就会每按照85的频率时间来发送一个垂直同步信号,信号和信号的时间间隔是上两次屏幕更新的时间间隔。
若是咱们选择等待垂直同步信号(也就是咱们平时所说的垂直同步打开),那么在游戏中或许强劲的显卡迅速的绘制完一屏的图像,可是没有垂直同步信号的到达,显卡没法绘制下一屏,只有等85单位的信号到达,才能够绘制。这样FPS天然要受到操做系统刷新率运行值的制约。
而若是咱们选择不等待垂直同步信号(也就是咱们平时所说的关闭垂直同步),那么游戏中做完一屏画面,显卡和显示器无需等待垂直同步信号就能够开始下一屏图像的绘制,天然能够彻底发挥显卡的实力。可是不要忘记,正是由于垂直同步的存在,才能使得游戏进程和显示器刷新率同步,使得画面更加平滑和稳定。取消了垂直同步信号,当然能够换来更快的速度,可是在图像的连续性上势必打折扣。这也正是不少朋友抱怨关闭垂直后发现画面不连续的理论缘由。
一、顶点性能
通常来讲,若是您想在iPhone 3GS或更新的设备上每帧渲染不超过40,000可见点,那么对于一些配备 MBX GPU的旧设备(好比,原始的iPhone,如 iPhone 3g和 iPod Touch第1和第2代)来讲,你应该保证每帧的渲染顶点在10000如下。
二、光照性能
像素的动态光照将对每一个受影响的像素增长显着的计算开销,并可能致使物体会被渲染屡次。为了不这种状况的发生,您应该避免对于任何单个物体都使用多个像素光照,并尽量地使用方向光。须要注意的是像素光源是一个渲染模式(Render Mode)设置为重要(Important)的光源。像素的动态光照将对顶点变换增长显着的开销。因此,应该尽可能避免任何给定的物体被多个光源同时照亮的状况。对于静态物体,采用烘焙光照方法则是更为有效的方法。
三、角色
每一个角色尽可能使用一个Skinned Mesh Renderer,这是由于当角色仅有一个 Skinned Mesh Renderer 时, Unity 会 使用可见性裁剪和包围体更新的方法来优化角色的运动,而这种优化只有在角色仅含有一个 Skinned Mesh Renderer 时才会启动。角色的面数通常不要超过1500,骨骼数量少于30就好,角色Material数量通常1~2个为最佳。
四、静态物体
对于静态物体定点数要求少于500,UV的取值范围不要超过(0,1)区间,这对于纹理的拼合优化颇有帮助。不要在静态物体上附加组件,虽然加了对结果没什么影响,可是会增长CPU开销。
五、摄像机
将远平面设置成合适的距离,远平面过大会将一些没必要要的物体加入渲染,下降效率。另外咱们能够根据不一样的物体来设置摄像机的远裁剪平面。Unity 提供了能够根据不一样的 layer 来设置不一样的 view distance ,因此咱们能够实现将物体进行分层,大物体层设置的可视距离大些,而小物体层能够设置地小些,另外,一些开销比较大的实体(如粒子系统)能够设置得更小些等等。
六、DrawCall
尽量地减小 Drawcall 的数量。 IOS 设备上建议不超过 100 。减小的方法主要有以下几种: Frustum Culling , Occlusion Culling , Texture Packing 。 Frustum Culling 是 Unity 内建的,咱们须要作的就是寻求一个合适的远裁剪平面; Occlusion Culling ,遮挡剔除, Unity 内嵌了Umbra ,一个很是好 OC 库。但 Occlusion Culling 也并非放之四海而皆准的,有时候进行 OC 反而比不进行还要慢,建议在 OC 以前先肯定本身的场景是否适合利用 OC 来优化; Texture Packing ,或者叫 Texture Atlasing ,是将同种 shader 的纹理进行拼合,根据 Unity 的 static batching 的特性来减小 draw call 。建议使用,但也有弊端,那就是必定要将场景中距离相近的实体纹理进行拼合,不然,拼合后极可能会增长每帧渲染所需的纹理大小,加大内存带宽的负担。这也就是为何会出现“ DrawCall 降了,渲染速度也变慢了”的缘由。android