最近项目进入收尾阶段,之前对项目做了很多优化,mesh合并 ,减少DrawCall和模型骨骼以及物理计算,合并材质球,优化代码等等,在IOS上还好,但是Android上,试过几款手机,从低端到高端,发现性能还是很差,所以又花了几天来研究摸索,终于把游戏性能搞定。记录下来,留作以后参考。

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 垂直同步

Unity3D中新建一个场景空的时候,帧速率(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自然要受到操作系统刷新率运行值的制约。

而如果我们选择不等待垂直同步信号(也就是我们平时所说的关闭垂直同步),那么游戏中作完一屏画面,显卡和显示器无需等待垂直同步信号就可以开始下一屏图像的绘制,自然可以完全发挥显卡的实力。但是不要忘记,正是因为垂直同步的存在,才能使得游戏进程和显示器刷新率同步,使得画面更加平滑和稳定。取消了垂直同步信号,固然可以换来更快的速度,但是在图像的连续性上势必打折扣。这也正是很多朋友抱怨关闭垂直后发现画面不连续的理论原因。

1、顶点性能

一般来说,如果您想在iPhone 3GS或更新的设备上每帧渲染不超过40,000可见点,那么对于一些配备 MBX GPU的旧设备(比如,原始的iPhone,如 iPhone 3g和 iPod Touch第1和第2代)来说,你应该保证每帧的渲染顶点在10000以下。

2、光照性能

像素的动态光照将对每个受影响的像素增加显著的计算开销,并可能导致物体会被渲染多次。为了避免这种情况的发生,您应该避免对于任何单个物体都使用多个像素光照,并尽可能地使用方向光。需要注意的是像素光源是一个渲染模式(Render Mode)设置为重要(Important)的光源。像素的动态光照将对顶点变换增加显著的开销。所以,应该尽量避免任何给定的物体被多个光源同时照亮的情况。对于静态物体,采用烘焙光照方法则是更为有效的方法。

3、角色

每个角色尽量使用一个Skinned Mesh Renderer,这是因为当角色仅有一个 Skinned Mesh Renderer 时, Unity 会 使用可见性裁剪和包围体更新的方法来优化角色的运动,而这种优化只有在角色仅含有一个 Skinned Mesh Renderer 时才会启动。角色的面数一般不要超过1500,骨骼数量少于30就好,角色Material数量一般1~2个为最佳。

4、静态物体

对于静态物体定点数要求少于500,UV的取值范围不要超过(0,1)区间,这对于纹理的拼合优化很有帮助。不要在静态物体上附加Animation组件,虽然加了对结果没什么影响,但是会增加CPU开销。

5、摄像机

将远平面设置成合适的距离,远平面过大会将一些不必要的物体加入渲染,降低效率。另外我们可以根据不同的物体来设置摄像机的远裁剪平面。Unity 提供了可以根据不同的 layer 来设置不同的 view distance ,所以我们可以实现将物体进行分层,大物体层设置的可视距离大些,而小物体层可以设置地小些,另外,一些开销比较大的实体(如粒子系统)可以设置得更小些等等。

6、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 降了,渲染速度也变慢了”的原因。

基于Unity3d 引擎的Android游戏优化 1相关推荐

  1. 基于Unity3d 引擎的Android游戏优化

    更新不透明贴图的压缩格式为ETC 4bit,因为android市场的手机中的GPU有多种,每家的GPU支持不同的压缩格式,但他们都兼容ETC格式, 对于透明贴图,我们只能选择RGBA 16bit 或者 ...

  2. android自动化测试unity,基于Unity3D引擎的UI自动化测试方案

    一.基本思路 熟悉Unity3D开发后就会发现,游戏的每个场景都有一个UI树,而通过这个UI树的根节点可以遍历整个UI树的所有UI对象.而Unity3D是通过挂载脚本的方式来控制游戏逻辑的,因此我们可 ...

  3. 基于Unity3D的AR小游戏开发【100011412】

    本科毕业设计(论文) GRADUATION DESIGN(THESIS) 基于 Unity3D 的增强现实游戏程序 摘要 增强现实(AR)作为一项新兴技术近年来被越来越多的人群所获知,AR 也渐渐走进 ...

  4. android游戏怎么发布,用Unity3d怎样发布Android游戏

    用Unity3d怎样发布Android游戏 初识unity3d已经有一段时间了.大约那是2012年的暑假.无意从手机上搜到了这个引擎.从今以后我就喜欢上他了.然后又从网上找了许多关于unity资料.一 ...

  5. 如何用GameMakerStudio开发基于物理引擎的平台游戏 | Lynda教程 中文字幕

    GameMakerStudio教程之如何用GML开发基于物理引擎的平台游戏 | Lynda教程 中文字幕 Building a Physics-Based Platformer in GameMake ...

  6. 如何测试基于Unity3D引擎的游戏

    版权声明:允许转载,但转载必须保留原链接:请勿用作商业或者非法用途 此文章来源于项目官方公众号:"AirtestProject" 由于游戏的界面是通过游戏引擎渲染出来的,游戏界面没 ...

  7. 基于Unity3D的塔防游戏

    课题主要内容 设计建议塔防游戏,实现规定敌人移动路线,在塔的基座的基础上升级塔.卖掉塔.更换塔,来射击敌人. 要求:1.基于c#编程语言实现: 2.发射子弹攻击敌人: 记录分数,判定游戏成功与否. 课 ...

  8. 基于unity3D的趣味桌球游戏开发

    设计主题 游戏中的主场景是一个四面有墙的场景,桌面上放置有可以滚动的小球和多个小方块,游戏开始后,玩家通过键盘控制球去吃方块,游戏得分会随着方块的减少而增长,当小球吃完全部的方块,得分达到最高,此时游 ...

  9. 基于Unity3D引擎制作大地图

    2.制做一张灰度图: 需求:Photoshop            GIMP 先Google 搜 WorldMap-A_non-Frame.png  这个地图下载一张到你pc 然后gimp打开它,  ...

最新文章

  1. R语言绘图-常用参数
  2. mysql 类型转换 cast 将 float 转换为 decimal
  3. Java的TreeMap统计单词数量
  4. ora-03115:不支持的网络数据类型 oracle,Oracle10g新增DBMS_FILE_TRANSFER包(二)
  5. Java开发中文件读取方式总结
  6. Spring的事务控制-基于xml方式
  7. java shp求相交面积_shp文件自相交处理的方法
  8. Istio Pilot 源码分析(一)
  9. JPA / Hibernate:基于版本的乐观并发控制
  10. phpstudy能安装不带mysql的么_装了phpstudy还需要装mysql吗
  11. iPhone 13或将配备更大容量电池 售价与iPhone 12基本相当
  12. 苹果WWDC 2019最全剧透抢先看:iOS夜间模式要来了!
  13. 黄金为什么贵,黄金都有什么用处?
  14. jmeter的逻辑控制器
  15. java B2B2C 多租户电子商城系统-SpringCloud动态刷新配置信息
  16. Apache POI 安全漏洞
  17. ad13批量安装元件库_AD18元件库下载及导入方法
  18. 详介 MQTT 服务器的搭建与客户端连接
  19. C# DIRECTX INPUT 模拟 (鼠标玩FBA街机)
  20. OPenCV4-颜色识别(二)三原色识别

热门文章

  1. php 获取照片信息,PHP中读取照片exif信息的方法
  2. 彻底解决IOS HTML页面上光标跳行、光标不跟随页面问题
  3. 重连通图及重连通分量
  4. 用Keil验证8位和32位单片机变量占用空间大小
  5. 代数余子式和余子式符号_【考研数学】线性代数之行列式、矩阵
  6. 计算机电源的指标,电源主要输出功能指标
  7. JS-时间戳转换为日期、时分秒-如2020-02-02 20:20:20
  8. 定义一个Car类,完成成员方法构造方法的多种使用方法以及基本案例
  9. 职场7种的工作方式方法工具汇总
  10. 奢侈品新星诞生了,能否打破现有的市场?