-
两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体,而且必须是运动的物体带有Rigidbody脚本才能检测到碰撞。
-
ArrayList存在不安全类型(ArrayList会把所有插入其中的数据都当做Object来处理),装箱拆箱的操作(费时),List是泛型类,功能跟ArrayList相似,但不存在ArrayList所说的问题。
-
Rigidbody具有完全真实物理的特性,Unity中物理系统最基本的一个组件,包含了常用的物理特性,而CharacterController可以说是受限的的Rigidbody,具有一定的物理效果但不是完全真实的,是Unity为了使开发者能方便的开发第一人称视角的游戏而封装的一个组件。
-
LOD(Level of detail)多层次细节,是最常用的游戏优化技术。它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。缺点是增加了内存。
-
MipMapping:在三维计算机图形的贴图渲染中有常用的技术,为加快渲染进度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为MipMap。
-
优化内存
(1)压缩自带类库;
(2)将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉;
(3)释放AssetBundle占用的资源;
(4)降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;
(5)使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。
(6)代码中少产生临时变量 -
String是字符串常量。
StringBuffer是字符串变量 ,线程安全。
StringBuilder是字符串变量,线程不安全。
String类型是个不可变的对象,当每次对String进行改变时都需要生成一个新的String对象,然后将指针指向一个新的对象,如果在一个循环里面,不断的改变一个对象,就要不断的生成新的对象,所以效率很低,建议在不断更改String对象的地方不要使用String类型。
StringBuilder对象在做字符串连接操作时是在原来的字符串上进行修改,改善了性能。这一点我们平时使用中也许都知道,连接操作频繁的时候,使用StringBuilder对象。 -
修饰符
(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 修饰符修饰它。 -
堆和栈
heap是堆,stack是栈。
stack的空间由操作系统自动分配和释放,heap的空间是手动申请和释放的,heap常用new关键字来分配。
stack空间有限,heap的空间是很大的自由区。 -
值类型和引用类型
(1)值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。
(2)值类型存取速度快,引用类型存取速度慢。
(3)值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用
(4)值类型继承自System.ValueType,引用类型继承自System.Object
(5)栈的内存分配是自动释放;而堆在.NET中会有GC来释放
(6)值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。 -
资源优化
(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里面配以相应的检查工具 -
Start、Update等方法,如果不用的话,删掉
-
不能单靠读取一个对象的activeSelf属性值来判断这个对象是否处于激活状态。取而代之的是应该使用activeInHierarchy属性,它会把父对象的状态考虑在内。
Unity中需要注意的细节
最新推荐文章于 2024-12-18 18:26:27 发布