unity优化

Unity教程之-Unity3d移动平台上性能优化专题(一):减少DrawCall

 

本篇unity3d教程,我们来学习下Unity3d移动平台上性能优化,首先我们来讲下如何减少Unity中Draw Call

一次DrawCall都会造成cpu巨大的性能开销,所以减少drawcall可以说是所有的性能优化中最重要的一环。

常见的做法都是通过合并纹理,尽量让一个模型只消耗一个drawcall,其实大部分游戏都是这么做的。当然你会发现正常情况下你的drawcall不会超过50.

外国一个大牛的原文

       Draw calls are expensive.  Every time you tell OpenGL ES to draw a buffer of verts, that call itself has a cost.  Actually, on most devices I think it is the state switch involved in selecting the verts that you wish to draw that incurs the real cost; if you were to draw the same buffer multiple times, the first draw call would be more expensive than the subsequent calls.  But generally speaking, we try to keep the number of draw calls as low as possible.  In Wind-up Knight 2 we have about 100 – 120 per frame.  Dungeon Slots is less than 40 per frame. More

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

 

这篇unity教程旨在简要地说明一下常见的各种优化策略。不过对每个基础有非常深入地讲解,需要的童鞋可以自行去相关资料。上一篇文章Unity3d优化之从Draw Calls到GC 我们也关于unity3d优化做了详细的讲解,本篇文章我们再来继续谈一下unity优化技术

影响性能的因素

首先,我们得了解,影响游戏性能的因素哪些,才能对症下药。对于一个游戏来说,有两种主要的计算资源:CPU和GPU。它们会互相合作,来让我们的游戏可以在预期的帧率和分辨率下工作。CPU负责其中的帧率,GPU主要负责分辨率相关的一些东西。

总结起来,主要的性能瓶颈在于:

  • CPU
    • 过多的Draw Calls
    • 复杂的脚本或者物理模拟
  • 顶点处理
    • 过多的顶点
    • 过多的逐顶点计算
  • 像素(Fragment)处理
    • 过多的fragment,overdraws
    • 过多的逐像素计算
  • 带宽
    • 尺寸很大且未压缩的纹理
    • 分辨率过高的framebuffer

对于CPU来说,限制它的主要是游戏中的Draw Calls。那么什么是Draw Call呢?如果你学过OpenGL,那么你一定还记得在每次绘图前,我们都需要先准备好顶点数据(位置、法线、颜色、纹理坐标等),然后调用一系列API把它们放到GPU可以访问到的指定位置,最后,我们需要调用_glDraw*命令,来告诉GPU,“嘿,我把东西都准备好了,你个懒家伙赶紧出来干活(渲染)吧!”。而调用_glDraw*命令的时候,就是一次Draw Call。那么为什么Draw Call会成为性能瓶颈呢(而且是CPU的瓶颈)?上面说到过,我们想要绘制图像时,就一定需要调用Draw Call。例如,一个场景里有水有树,我们渲染水的时候使用的是一个material以及一个shader,但渲染树的时候就需要一个完全不同的material和shader,那么就需要CPU重新准备顶点数据、重新设置shader,而这种工作实际是非常耗时的。如果场景中,每一个物体都使用不同的material、不同的纹理,那么就会产生太多Draw Call,影响帧率,游戏性能就会下降。当然,这里说得很简单,更详细的请自行谷歌。其他CPU的性能瓶颈还有物理、布料模拟、粒子模拟等,都是计算量很大的操作。

而对于GPU来说,它负责整个渲染流水线。它会从处理CPU传递过来的模型数据开始,进行Vertex Shader、Fragment Shader等一系列工作,最后输出屏幕上的每个像素。因此它的性能瓶颈可能和需要处理的顶点数目的、屏幕分辨率、显存等因素有关。总体包含了顶点和像素两方面的性能瓶颈。在像素处理中,最常见的性能瓶颈之一是overdraw。Overdraw指的是,我们可能对屏幕上的像素绘制了多次。

了解了上面基本的内容后,下面涉及到的优化技术有:

  • 顶点优化
    • 优化几何体
    • 使用LOD(Level of detail)技术
    • 使用遮挡剔除(Occlusion culling)技术
  • 像素优化
    • 控制绘制顺序
    • 警惕透明物体
    • 减少实时光照
  • CPU优化
    • 减少Draw Calls
  • 带宽优化
    • 减少纹理大小
    • 利用缩放

More

Unity3d架构系列之- FSM有限状态机设计二

 

继续上篇文章在设计一中,我们实现了有限状态机管理类,接下来,我们实现FSState这个类,这里类主要是状态的基本操作以及事件触发。在这里我们定义了在FiniteStateMachine类里声明的三个委托。在FSState里面使用的代码如下:


protected FiniteStateMachine.EnterState mEnterDelegate;
protected FiniteStateMachine.PushState mPushDelegate;
protected FiniteStateMachine.PopState mPopDelegate;

这个FSState是独立的一个类,不继承Mono,我们定义了一个构造函数,将我们的委托进行了初始化:

More

Unity3D优化静态对象系列一

 

unity3D对于静态对象优化,一种方式是使用Unity自带的功能比如可以选择Static,这样Unity引擎内部会对其进行优化批处理,无需使用者关心,比较简单,但是还是不够理想。另一种方式是我们用脚本进行控制,用脚本对其进行优化,相对前者效率方面比如在DrawCall上可以减少。接下来我们逐步解析,优化直至达到我们的要求为止,本次作为一个系列来讲解,为了让大家更能透彻的理解。
我们先看一下,没选择Static和选择Static的比较结果,我们是以三个Cube为例采用同样的材质,如图所示:

静态对象

More