区别:
new对象时,当可分配的内存不足GC就会去回收未使用的对象,但是GC的操作是非常复杂的,会占用很多CPU时间,对于移动设备来说频繁的垃圾回收会严重影响性能。下面的建议可以避免GC频繁操作。
相同点:
区别:
List ls = new List(new int[] { 1,2,3,4,5});
foreach (var item in ls)
{
Console.WriteLine(item*item);
ls.Remove(item);
}
会产生运行时错误,不能一边遍历一边修改。建议使用for循环来代替,foreach建议只用在读取上,不用在修改上。
类声明时可防止其他类继承此类,在方法中声明则可防止派生类重写此方法。
审查元数据并收集关于它的类型信息的能力。反射个人认为,就是得到程序集中的属性和方法。
实现步骤:
U3D中用于记录节点空间几何信息的组件名称是 Transform ,它的父类是 Component。
四元数用于表示旋转。
相对欧拉角的优点:
实际看到的画面由多个camera的画面组成;由depth、Clear Flag、Culling Mask都会影响最终合成效果。
在游戏运行时实例化,prefab相当于一个模版,对你已有的素材、脚本、参数做一个默认配置,以便于以后修改,同时prefab打包的内容简化了导出的操作,便于团队的交流。
修改sharedMaterial将改变所有物体使用这个材质的外观,并且也改变储存在工程里的材质设置。不推荐修改由sharedMaterial返回的材质。如果你想修改渲染器的材质,使用material替代。
关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活Quake2中使用了这种动画。
单一网络模型动画:由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。
骨骼动画:广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,由关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观。皮肤网格每一个顶点都会受到骨骼的影响,从而实现完美的动画。(骨骼动画是由关节动画发展而来的,如今基本都使用骨骼动画来实现角色动画)。
实际显示颜色 = 前景颜色*Alpha/255 + 背景颜色*(255-Alpha)/255。
LOD技术即Levels of Detail的简称,意为多细节层次。
LOD技术指根据物体模型的节点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
优点:可根据距离动态地选择渲染不同细节的模型
缺点:加重美工的负担,要准备不同细节的同一模型,同样的会稍微增加游戏的容量。
在三维计算机图形的贴图渲染中有一个常用的技术被称为Mipmapping。为了加快渲染速度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为 MIP map 或者 mipmap。
collider碰撞器会有碰撞的效果,IsTrigger = false,可以调用OnCollisionEnter/Stay/Exit函数。
trigger触发器没有碰撞效果,isTrigger = true,可以调用OnTriggerEnter/stay/exit函数。
物体A必须带有(collider+rigidbody)或者CharacterController,另一个物体也必须至少带有collider。
Hinge Joint ,他可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。(简单说就是弹簧)
transform.Rotate和 transform.RotateAround
PlayerPrefs.SetInt ()与 PlayerPrefs.GetInt()。
Awake –>OnEnable –> Start –> Update –> FixedUpdate –> LateUpdate –> OnDisable –> OnDestroy;
FixedUpdate,每固定帧绘制时执行一次,和update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。
FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。
Update就比较适合做控制。
LateUpdate,,是在所有update结束后才调,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。
是指在显示器上为了显示出图像而经过的一系列必要操作。 渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。
主要步骤有:
本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化。
表达式形式:(Input Param)=>Expression。在表达式左侧的表示输入参数,右侧的为相应的运算语句或者判断语句等,可包含函数调用等复杂方式。运算符=>读作为goes to,例如下面这个表达t=>t.ClassCode='1001',多做goes to ClassCode equal 1001。
在上述的表达式中,仅仅只有当参数只有一个的时候,括号是可选择的,例如下面这种含有两个参数时候的情况应该是这样子的写法:(a,b)=>a==b
当表达式中的多个参数编译器无法自动判断类型的时候,则需要显式指定类型。
(
int
firstIndex,
string
str) => str.IndexOf(
'Hello'
) > firstIndex
private void Start()
{
print(FunTest(4));
}
public int FunTest(int num)
{
if (num <= 0)
{
return 0;
}
else if (num == 1 || num == 2)
{
return 1;
}
else
{
return FunTest(num - 1) + FunTest(num - 2);
}
}
Mathf.Abs绝对值
计算并返回指定参数 f 绝对值。
Mathf.Acos反余弦
static function Acos (f : float) : float 以弧度为单位计算并返回参数 f 中指定的数字的反余弦值。
Mathf.Clamp01限制0~1
static function Clamp01 (value : float) :float 限制value在0,1之间并返回value。如果value小于0,返回0。如果value大于1,返回1,否则返回value 。
Mathf.Clamp限制
static function Clamp (value : float, min :float, max : float) : float 限制value的值在min和max之间, 如果value小于min,返回min。 如果value大于max,返回max,否则返回value static function Clamp (value : int, min :int, max : int) : int 限制value的值在min和max之间,并返回value。
Mathf.Deg2Rad度转弧度
static var Deg2Rad : float 度到弧度的转化常量。(只读) 这等于(PI * 2) / 360。
Mathf.Mathf.Rad2Deg 弧度转度
static var Rad2Deg : float 弧度到度的转化常量。(只读) 这等于 360 / (PI * 2)。
Mathf.Infinity正无穷
static var Infinity : float 表示正无穷,也就是无穷大,∞ (只读)
Mathf.Lerp插值
static function Lerp (from : float, to :float, t : float) : float 基于浮点数t返回a到b之间的插值,t限制在0~1之间。 当t = 0返回from,当t = 1 返回to。当t = 0.5 返回from和to的平均值。
Mathf.MoveTowards移向
static function MoveTowards (current :float, target : float, maxDelta : float) : float 改变一个当前值向目标值靠近。 这实际上和 Mathf.Lerp相同,而是该函数将确保我们的速度不会超过maxDelta。maxDelta为负值将目标从推离。
Mathf.RoundToInt四舍五入到整数
static function RoundToInt (f : float) :int 返回 f 指定的值四舍五入到最近的整数。 如果数字末尾是.5,因此它是在两个整数中间,不管是偶数或是奇数,将返回偶数。
Mathf.Round四舍五入
static function Round (f : float) : float 返回浮点数 f 进行四舍五入最接近的整数。 如果数字末尾是.5,因此它是在两个整数中间,不管是偶数或是奇数,将返回偶数。
Mathf.Sqrt平方根
static function Sqrt (f : float) : float 计算并返回 f 的平方根。
结构体是一种值类型,而类是引用类型。
(值类型、引用类型是根据数据存储的角度来分的)就是值类型用于存储数据的值,引用类型用于存储对实际数据的引用。那么结构体就是当成值来使用的,类则通过引用来对实际数据操作。
相同点:ref和out参数的效果一样,都是通过关键字找到定义在主函数里面的变量的内存地址,并通过方法体内的语法改变它的小。
不同点:就是输出参数必须对参数进行初始化。ref必须初始化,out 参数必须在函数里赋值。
ref参数是引用,out参数为输出参数。
委托类似于一种安全的指针引用,在使用它时是当做类来看待而不是一个方法,相当于对一组方法的列表的引用。
用处:使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。
与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的。
Unity中,照相机的Clipping Planes的作用是什么剪裁平面 。
Near和Far是从相机到开始渲染和停止渲染之间的距离。
heap是堆,stack是栈。
stack的空间由操作系统自动分配和释放,heap的空间是手动申请和释放的,heap常用new关键字来分配。
stack空间有限,heap的空间是很大的自由区。
里氏替换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。
通俗点:就是子类对象可以赋值给基类对象,基类对象不能赋值给子类对象。(可以说猪是动物但不能说动物是猪)
序列化简单理解成把对象转换为容易传输的格式的过程。
比如:可以序列化一个对象,然后使用HTTP通过Internet在客户端和服务器端之间传输该对象。
栈通常保存着我们代码执行的步骤,如在代码段1中 AddFive()方法,int pValue变量,int result变量等等。
而堆上存放的则多是对象,数据等。我们可以把栈想象成一个接着一个叠放在一起的盒子。当我们使用的时候,每次从最顶部取走一个盒子。
栈也是如此,当一个方法(或类型)被调用完成的时候,就从栈顶取走,接着下一个。堆则不然,像是一个仓库,储存着我们使用的各种对象等信息,跟栈不同的是他们被调用完毕不会立即被清理掉。
socket通常也称作”套接字”,实现服务器和客户端之间的物理连接,并进行数据传输,主要有UDP和TCP两个协议。Socket处于网络协议的传输层。
http协议传输的主要有http协议 和基于http协议的Soap协议(web service),常见的方式是 http 的post 和get 请求,web 服务。
Sprite作为UI精灵使用,Texture作用模型贴图使用。Sprite需要2的整次幂,打包图片省资源。
Unity中,每次引擎准备数据并通知GPU的过程称为一次Draw Call。DrawCall越高对显卡的消耗就越大。
降低DrawCall的方法:
1. Dynamic Batching
2. Static Batching
3. 高级特性Shader降级为统一的低级特性的Shader。