Unity中需要注意的细节

  1. 两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体,而且必须是运动的物体带有Rigidbody脚本才能检测到碰撞。

  2. ArrayList存在不安全类型(ArrayList会把所有插入其中的数据都当做Object来处理),装箱拆箱的操作(费时),List是泛型类,功能跟ArrayList相似,但不存在ArrayList所说的问题。 

  3. Rigidbody具有完全真实物理的特性,Unity中物理系统最基本的一个组件,包含了常用的物理特性,而CharacterController可以说是受限的的Rigidbody,具有一定的物理效果但不是完全真实的,是Unity为了使开发者能方便的开发第一人称视角的游戏而封装的一个组件。

  4. LOD(Level of detail)多层次细节,是最常用的游戏优化技术。它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。缺点是增加了内存。

  5. MipMapping:在三维计算机图形的贴图渲染中有常用的技术,为加快渲染进度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为MipMap。

  6. 优化内存
    (1)压缩自带类库;
    (2)将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉;
    (3)释放AssetBundle占用的资源;
    (4)降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;
    (5)使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。
    (6)代码中少产生临时变量

  7. String是字符串常量。
    StringBuffer是字符串变量 ,线程安全。
    StringBuilder是字符串变量,线程不安全。
    String类型是个不可变的对象,当每次对String进行改变时都需要生成一个新的String对象,然后将指针指向一个新的对象,如果在一个循环里面,不断的改变一个对象,就要不断的生成新的对象,所以效率很低,建议在不断更改String对象的地方不要使用String类型。
    StringBuilder对象在做字符串连接操作时是在原来的字符串上进行修改,改善了性能。这一点我们平时使用中也许都知道,连接操作频繁的时候,使用StringBuilder对象。

  8. 修饰符
    (1)属性修饰符:
      Serializable:按值将对象封送到远程服务器。
      STATread:是单线程套间的意思,是一种线程模型。
      MATAThread:是多线程套间的意思,也是一种线程模型。
    (2)存取修饰符:
      public:存取不受限制。
      private:只有包含该成员的类可以存取。
      internal:只有当前工程可以存取。
      protected:只有包含该成员的类以及派生类可以存取。
    (3)类修饰符:
      abstract:抽象类。指示一个类只能作为其它类的基类。
      sealed:密封类。指示一个类不能被继承。理所当然,密封类不能同时又是抽象类,因为抽象总是希望被继承的。
    (4)成员修饰符:
      abstract:指示该方法或属性没有实现。
      sealed:密封方法。可以防止在派生类中对该方法的override(重载)。不是类的每个成员方法都可以作为密封方法密封方法,必须对基类的虚方法进行重载,提供具体的实现方法。所以,在方法的声明中,sealed修饰符总是和override修饰符同时使用。
      delegate:委托。用来定义一个函数指针。C#中的事件驱动是基于delegate + event的。
      const:指定该成员的值只读不允许修改。
      event:声明一个事件。
      extern:指示方法在外部实现。
      override:重写。对由基类继承成员的新实现。
      readonly:指示一个域只能在声明时以及相同类的内部被赋值。
      static:指示一个成员属于类型本身,而不是属于特定的对象。即在定义后可不经实例化,就可使用。
      virtual:指示一个方法或存取器的实现可以在继承类中被覆盖。
      new:在派生类中隐藏指定的基类成员,从而实现重写的功能。 若要隐藏继承类的成员,请使用相同名称在派生类中声明该成员,并用 new 修饰符修饰它。

  9. 堆和栈
    heap是堆,stack是栈。
    stack的空间由操作系统自动分配和释放,heap的空间是手动申请和释放的,heap常用new关键字来分配。
    stack空间有限,heap的空间是很大的自由区。

  10. 值类型和引用类型
    (1)值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。
    (2)值类型存取速度快,引用类型存取速度慢。
    (3)值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用
    (4)值类型继承自System.ValueType,引用类型继承自System.Object
    (5)栈的内存分配是自动释放;而堆在.NET中会有GC来释放
    (6)值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。

  11. 资源优化
    (1)使用assetbundle,实现资源分离和共享,将内存控制到200m之内,同时也可以实现资源的在线更新
    (2)顶点数对渲染无论是cpu还是gpu都是压力最大的贡献者,降低顶点数到8万以下,fps稳定到了30帧左右
    (3)只使用一盏动态光,不是用阴影,不使用光照探头
    (4)粒子系统是cpu上的大头
      剪裁粒子系统
      合并同时出现的粒子系统
      自己实现轻量级的粒子系统
    (5)animator也是一个效率奇差的地方
      把不需要跟骨骼动画和动作过渡的地方全部使用animation,控制骨骼数量在30根以下
      animator出视野不更新
      删除无意义的animator
      animator的初始化很耗时(粒子上能不能尽量不用animator)
      除主角外都不要跟骨骼运动apply root motion
    (6)绝对禁止掉那些不带刚体带包围盒的物体(static collider )运动
    (7)NUGI的代码效率很差,基本上runtime的时候对cpu的贡献和render不相上下
    (8)每帧递归的计算finalalpha改为只有初始化和变动时计算
    (9)去掉法线计算
    (10)不要每帧计算viewsize 和windowsize
    (11)filldrawcall时构建顶点缓存使用array.copy
    (12)代码剪裁:使用strip level ,使用.net2.0 subset
    (13)尽量减少smooth group
    (14)给美术定一个严格的经过科学验证的美术标准,并在U3D里面配以相应的检查工具

  12. Start、Update等方法,如果不用的话,删掉

  13. 不能单靠读取一个对象的activeSelf属性值来判断这个对象是否处于激活状态。取而代之的是应该使用activeInHierarchy属性,它会把父对象的状态考虑在内。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

末零

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值