版权声明:本文为博主原创文章,欢迎转载。请保留博主链接:http://blog.csdn.net/andrewfan


做游戏好多年了,关于游戏优化一直是令开发者头疼的一个问题。因为优化牵扯的内容很多,要求掌握的知识点比较全面。在接下来的系列文章中,我想分享一下自己的一些经验。一些有误或者不完善之处请小伙伴们给我意见,加入一起探讨和学习。

程序消耗

所谓的优化,目的应该是尽可能减弱某种消耗,而在Unity上来说,大概可以分为以下几种:

  • 程序的运行速度
  • 程序的资源消耗
  • 程序的功耗消耗

程序的运行速度,一般是指运行帧率,也包括加载速度。是我们首要考虑的重点,也是将会花最多的精力去探讨的话题,运行帧率是游戏类项目的一个非常重要的性能指标,帧率的下降将直接导致游戏体验的下降。 
程序的资源消耗,一般是指包体大小,占据用户客户端的存储空间大小,也包括网络消耗,占据多少带宽。这些虽然不那么影响用户当下的体验,不过指标太高也会降用户接受度。 
程序的功耗消耗,一般是指应用程序的耗电量,一款程序做的很好,但是功耗太高,使用后短时间内发热太厉害,也会导致玩家无法使用。这种优化跟显卡直接关联,显卡厂商也有很多优化测试和评估程序帮助我们实现降低功能。 
按优化的优先级来说,程序的运行速度是首要的。我先列出今后可能会涉及到的关于提高运行速度进行相关的优化策略。

运行速度的瓶颈

我自己所认为解决优化问题的所有手段虽然很多,不过关键的是思路就是找到适合你自己的项目的优化方法,消除性能消耗的瓶颈。 
一般而言,运行速度可能存在的瓶颈有以下一些方面:

  • CPU消耗:

    • 过多的DrawCall
    • 过多的物理计算
    • 过于复杂、低效的算法
    • 频繁的GC
  • GPU消耗 
    • 过多的顶点需要处理
    • 过于复杂的逐顶点计算
    • 过多的片元需要处理
    • 过于复杂的片元计算
  • 带宽消耗 
    • 过大和未压缩的贴图格式
    • 过高分辨率的帧缓存

需要说明的是,这里的带宽消耗是说从CPU端传送数据到GPU时所消耗的带宽,而不是网络消耗。 
以上的所有部分,都有可能成为你的程序运行速度的瓶颈,因此我们需要掌握一些相应的优化手段来消除这些瓶颈。 
有些概念,比如DrawCall、顶点计算、片元计算,做一个简单解释: 
DrawCall:以OpenGL为例,就是一次OpenGL渲染流水线的运行过程,固定流水线简单示意如下: 
 
也就是说,假设现在Unity世界中有一个物体的模型,从其上的所有顶点,如何经过顶点的装配、裁剪,再到将处理后的面(片元)渲染出来的一整个流程。 
上图是固定流水线的流程,而当前我们使用的GPU都是可编程的流水线,也就是在上述步骤中插入一些可编程的环节。包括前面所说的:逐顶点计算、片元处理等。

优化策略

针对上述问题,我们需要提出相应的解决方案。

  1. 如何提高脚本运行效率?

    • 降低算法的复杂度,了解常见的数据结构和算法
    • 使用协程来避免多余的更新计算。
    • 缓存耗时计算的中间值
    • 缓存获取过的Componenet
    • IMGUI只用与测试,发布时应该屏蔽
  2. 如何避免频繁的GC? 
    • 为快速产生和消灭的大量对象建立缓冲池(Pool)
    • 当频繁拼凑字符串时,使用StringBuilder,而不是直接加减
    • 一些数量众多,功能简单的小对象,使用结构体而非类
    • 正确地使用foreach
  3. 如何降低DrawCall? 
    • 静态批处理
    • 动态批处理
    • 网格和材质的静态合并
    • 网格和材质的动态合并
    • 使用Instance LOD
  4. 如何优化顶点数和顶点计算? 
    • 尽可能在制作时控制顶点数目
    • 移除那些不需要的硬边缘和UV缝接
    • 使用Unity的LODGroup
    • 调整视椎体裁剪Frustum culling
    • 使用遮蔽剔除Occlusion culling
  5. 如何优化片元计算? 
    • 尽可能减少复杂的片元计算,如实时光照和实时阴影
    • 使用光照贴图实现全局光照,light probes实现简易的动态阴影
    • 使用更加高效的Shader(Unity上的Mobile版本)
    • 减少半透明物体,并控制它们的渲染顺序,尽可能减少重绘(OverDraw)
  6. 如何降低物理计算?

    • 尽可能少用刚体,不重要的物体可以自己写简易的模拟物理
    • 尽可能减少直接的模型网格碰撞,应使用包围盒简易碰撞体替代
    • 如果可以的话,增加fixedUpdate的运行间隔
    • 使用高效的射线检测算法,并避免产生GC

    后续

    以上是我列出的将来可能涉及到的话题,有的可能就是一句话就能了解,有的可能深入探讨的话题就比较深入。其中关于“为快速产生和消灭的大量对象建立缓冲池(Pool)”这个话题,可以参见我的博客《Unity3D-使用对象池高效管理内存》一文。后续其它话题,我会陆续整理和更新。

    本文参考:http://malideveloper.arm.com/downloads/Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms.pdf

 
 

【Unity优化】Unity优化技巧进阶开篇的更多相关文章

  1. Unity UI性能优化技巧

    本文将介绍一些提升Unity UI性能的技巧.更多优化技巧,可以观看Unity工程师Ian Dundore在Unite Europe 2017的演讲<使用Unity性能提升技巧>. 1.划 ...

  2. 【Unity技巧】Unity中的优化技术

    http://blog.csdn.net/candycat1992/article/details/42127811 写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得 ...

  3. Unity 几种优化建议

    转: http://user.qzone.qq.com/289422269/blog/1453815561?ptlang=2052 Unity 几种优化建议 最简单的优化建议: 1.PC平台的话保持场 ...

  4. 通过profiler对unity进行针对性优化

    转 : http://user.qzone.qq.com/289422269/blog/1453815629?ptlang=2052 通过profiler对unity进行针对性优化  1. CPU U ...

  5. Unity教程之再谈Unity中的优化技术

    这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体   这一步主要是为了针对性能瓶颈中的”顶点 ...

  6. [Unity 3D] Unity 3D 性能优化 (一)

    听到过很多用Unity 3D开发游戏的程序员抱怨引擎效率太低,资源占用太高,包括我自己在以往项目的开发中也头疼过.最近终于有了空闲,可以仔细的研究一下该如何优化Unity 3D下的游戏性能.其实国外有 ...

  7. Unity 绘图性能优化 - Draw Call Batching

    Unity 绘图性能优化 - Draw Call Batching Unity官方链接:http://docs.unity3d.com/Manual/DrawCallBatching.html 转载请 ...

  8. Unity优化之GC——合理优化Unity的GC

      转载请标明出处http://www.cnblogs.com/zblade/ 最近有点繁忙,白天干活晚上抽空写点翻译,还要运动,所以翻译工作进行的有点缓慢 =.= PS: 最近重新回来更新了一遍,文 ...

  9. Unity优化方向——优化Unity游戏中的图形渲染(译)

    CPU bound:CPU性能边界,是指CPU计算时一直处于占用率很高的情况. GPU bound:GPU性能边界,同样的是指GPU计算时一直处于占用率很高的情况. 原文:https://unity3 ...

随机推荐

  1. UVa 299 - Train Swapping

    题目大意:给n个数的一个序列,通过交换相邻的两个数使得这n个数按照从小到大的顺序排列. Inversion index problem: count how many swaps are needed ...

  2. eclipse-ee修改字体大小和配置Tomcat服务器

    参考博客:http://blog.csdn.net/lpftobetheone/article/details/17783791 一.EclipseEE背景色和字体的修改 1.Eclipse背景颜色修 ...

  3. SQL数据库文件修复/用友/金蝶/管家婆/速达/思讯数据库恢复 硬盘恢复

    硬盘的故障情况可以分为以下几类: 1.控制电路故障 大部分外电路的问题是电源芯片或主轴驱动芯片烧坏引起的,由于硬盘电路板质量问题.设计缺陷.市电波动.突然断电.芯片老化或者散热不良.静电等原因造成芯片 ...

  4. php调用js变量

    <script> function tuichu(skp){ <?php $ok="skp"; echo "alert($ok)";//实验代 ...

  5. Selenium关于Page Objects

    介绍页面对象设计模式.一个页面对象表示在你测试的web页面用户交互的界面. 使用页面对象模式的有点: 创建可重用的代码可以在多个测试用例中使用 减少重复的代码量 如果用户界面改变,只需要修改一个地方 ...

  6. Mysql中常见索引操作

  7. php session 生命周期代码实例

     php session 生命周期代码实例        我们为什么需要Session,就是因为我们需要存储各个用户的状态数据.那么试问,如果由你来设计解决这个需求的方案,那么也许你会设置这样一个数据 ...

  8. HDU 3374 String Problem (KMP+最大最小表示)

    HDU 3374 String Problem (KMP+最大最小表示) String Problem Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  9. flex blazeds地址

    flex blazeds地址 BlazeDS地址:http://sourceforge.net/adobe/blazeds/wiki/Home/最新BlazeDS版本是2011年编译的4.0.1.21 ...

  10. mesos 资源分配

    Mesos 资源分配 众所周知, Mesos在运行时使用wDRF( Dominant Resource Fairness)算法进行一级资源分配, 通过应用程序(Framework)运行时使用资源进行二 ...