• Unity开发-你必须知道的优化建议


    转载;http://blog.csdn.net/leonwei/article/details/18042603

    最近研究U3D开发,个人认为,精通一种新的技术,最快最好的方法就是看它的document,而且个人习惯不喜欢看中文的资料,原汁原味的东西是最正确的,一翻译过来很多东西就都不那么准确了。于是通读了unity的官方manuel,最后面几章都是精华,里面给了非常非常多的官方的优化建议,尤其是做移动平台的开发,这些建议就是非常重要的。我将官方manuel advanced后面的那几个章节的东西提炼了一下出来,总结了这样一些优化tips:

    1不是每个主流手机都支持的技术(就是如果可以不用就不用或有备选方案)

    屏幕特效

    动态的pixel光照计算(如法线)

    实时的阴影

    2优化建议

    2.1渲染

    1.不使用或少使用动态光照,使用light mapping和light probes(光照探头)

    2.不使用法线贴图(或者只在主角身上使用),静态物体尽量将法线渲染到贴图

    3.不适用稠密的粒子,尽量使用UV动画

    4.不使用fog,使用渐变的面片(参考shadow gun)

    5.不要使用alpha –test(如那些cutout shader),使用alpha-blend代替

    6.使用尽量少的material,使用尽量少的pass和render次数,如反射、阴影这些操作

    7.如有必要,使用Per-Layer Cull Distances,Camera.layerCullDistances

    8.只使用mobile组里面的那些预置shader

    9.使用occlusion culling

    11.远处的物体绘制在skybox上

    12.使用drawcall batching:

            对于相邻动态物体:如果使用相同的shader,将texture合并

            对于静态物体,batching要求很高,详见Unity Manual>Advanced>Optimizing Graphics Performance>Draw Call Batching

    规格上限

    1.      每个模型只使用一个skinned mesh renderer

    2.      每个mesh不要超过3个material

    3.      骨骼数量不要超过30

    4.      面数在1500以内将得到好的效率

    2.2物理

    1.真实的物理(刚体)很消耗,不要轻易使用,尽量使用自己的代码模仿假的物理

    2.对于投射物不要使用真实物理的碰撞和刚体,用自己的代码处理

    3.不要使用mesh collider

    4.在edit->project setting->time中调大FixedTimestep(真实物理的帧率)来减少cpu损耗

    2.3脚本编写

    1.尽量不要动态的instantiate和destroy object,使用object pool

    2.尽量不要再update函数中做复杂计算,如有需要,可以隔N帧计算一次

    3.不要动态的产生字符串,如Debug.Log("boo" + "hoo"),尽量预先创建好这些字符串资源

    4.cache一些东西,在update里面尽量避免search,如GameObject.FindWithTag("")、GetComponent这样的调用,可以在start中预先存起来

    5.尽量减少函数调用栈,用x = (x > 0 ? x : -x);代替x = Mathf.Abs(x)

    6.下面的代码是几个gc“噩梦”

     String的相加操作,会频繁申请内存并释放,导致gc频繁,使用System.Text.StringBuilder代替

       function ConcatExample(intArray: int[]) {

                   var line = intArray[0].ToString();

     

                   for (i = 1; i < intArray.Length; i++) {

                                   line += ", " + intArray[i].ToString();

                   }

     

                   return line;

    }

    在函数中动态new array,最好将一个array、传进函数里修改

    function RandomList(numElements: int) {
              var result = new float[numElements];
     
              for (i = 0; i < numElements; i++) {
                             result[i] = Random.value;
              }
     
              return result;
    }

     

    2.4 shader编写

    1.数据类型

     fixed / lowp - for colors, lighting information and normals,

    half / mediump - for texture UV coordinates,

    float / highp - avoid in pixel shaders, fine to use in vertex shader for position calculations.

    2.少使用的函数:pow,sin,cos等

    2.4 GUI

    1.不要使用内置的onGUii函数处理gui,使用其他方案,如NGUI

    3.格式

    1.贴图压缩格式:ios上尽量使用PVRTC,android上使用ETC

  • 相关阅读:
    Linux crontab 的常用定时方式
    Windows 查看端口及进程信息
    java.io.IOException: com.esotericsoftware.kryo.KryoException
    Linux 如何让挂载的硬盘永久生效
    六边形架构-微服务基石
    包和工具
    谈一谈对java简单的理解
    HTTP报文 「HTTP
    四层 or 七层 「HTTP
    setTimeout不生效
  • 原文地址:https://www.cnblogs.com/sanyejun/p/7824921.html
Copyright © 2020-2023  润新知