乱糟unity整理

当Canvas上的UI元素变化时,会重新生成网格并向GPU发起绘图调用,从而显示UI.
划分画布:
1.每块画布上的元素都与其他画布的元素相隔离,使用?工具来切分画布?,从而解决ui的批处理问题.
2.也可以通过嵌套画布来解决,这样能允许设计师创建大型分层ui,子画布内容与父画布和同级画布相互隔离.保持自带几何体,执行自己的批处理.
3.当使用子画布分离画布时,尝试根据画布更新时间来分组.例如:分离动态元素和静态元素.

====================================================================


Graphic Raycaster组件
尽量减少Graphic Raycaster的数量,不要讲 Graphic Raycaster组件添加到非交互式ui画布上.

====================================================================

Unity的协程是在每帧结束后去检测yield的条件是否满足.

====================================================================

碰撞器是触发器的载体,触发器只是碰撞器的一个属性.
当IsTrigger是false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;
当IsTrigger为true时,碰撞器会被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数;
既监测到物体的接触又不想让碰撞检测影响到物体的移动或要检测一个物件是否经过空间的某个区域时就可以用到触发器.

====================================================================

碰撞的必要条件:
两个物体必须都有collider,其中一个物体必须有Rigidbody,且必须是运动的物体带有rigidbody组件才能检测到碰撞.

====================================================================

ArrayList存放不安全类型(把所有其中的数据都当作Object来处理).

====================================================================

unity的AssetServer功能??

====================================================================

几种施加力的方式:
rigidbody.AddForce/AddForceAtPosition

====================================================================

链条关节(Hinge Joint):
模拟两个物体间用一根链条链接在一起的情况,能保持两个物体在一个固定距离内不产生作用力,达到这个固定距离后就会产生拉力.

====================================================================

物体自身旋转:
Transform.Rotate

====================================================================

物体发生碰撞的过程的阶段函数:
OnCollisionEnter、OnCollisionStay、OnCollisionExit

====================================================================

unity脚本从唤醒到销毁的完整的生命周期
Awake -> OnEnable -> Start -> Update -> FixedUpdate -> LateUpdate -> OnGUI -> OnDisable -> OnDestroy

====================================================================

FixedUpdate和Update的区别:
Update是渲染帧执行的,如果渲染效率低执行次数就会变少;
FixedUpdate是固定时间间隔执行.

====================================================================

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

====================================================================

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

====================================================================

Interface 和 abstract class 的区别:
接口中只能声明一些方法的名字参数返回值,不能包含具体的实现代码.实现接口的类必须实现接口中的所有方法.
抽象类中可以包含一些具体实现.

====================================================================

.net和mono的关系:
mono是.net的一个开源跨平台工具,类似java的虚拟机,java本身不能跨平台,运行在虚拟机上就能够实现跨平台..net只能在windows下运行,mono可以实现跨平台运行,可以运行与linux、unix、mac os等.

====================================================================

向量的点乘、叉乘和归一化的意义:
点乘描述了两个向量的相似程度,结果越大两个向量越相似,还可表示投影.
叉乘得到的向量垂直于原来的两个向量.
归一化(标准化向量):只关心方向,不关心大小的时候.

====================================================================

如何在不同分辨率下保持UI的一致性:
NGUI是通过计算出屏幕的宽高比跟原来预设的屏幕分辨率的一个对比值,然后修改摄像机的size.
UGUI通过锚点和中心点和分辨率来解决这个问题.

====================================================================

什么是LightMap?
指在三维软件里实现打好光,然后渲染把场景各个表面的光照输出到贴图上,然后通过引擎贴到场景上,这样就使得物体有了光照的感觉. https://blog.csdn.net/rickshaozhiheng/article/details/72773705

====================================================================

C#和cpp的区别
C#是完全面向对象的语言,而c++不是,另外C#是基于IL中间语言和 .NET Framework CLR的,在可移植性、可维护性和健壮性上都比c++有很大的改进. C#的设计目标是用来开发快速稳定可扩展的应用程序.C#也可以通过Interop和Pinvoke完成一些底层操作.

====================================================================

ref和out参数的区别?
ref和out参数的效果是一样的,都是通过关键字找到定义在主函数中的变量的内存地址,并在方法体内改变它的值.
不同的是ref必须初始化,out参数必须在函数里赋值.ref参数是引用,out参数为输出参数.

====================================================================

c#的委托?
委托类似于一种安全的指针引用,使用它时应该当作类而不是一个方法,相当于对一组方法列表的引用.
用处:使用委托使程序员可以将方法引用封装在委托对象内.然后通过该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法.与c/c++的函数指针不同,委托是面向对象,而且是类型安全的.

====================================================================

c#的排序方式?
选择排序,冒泡排序,快速排序,插入排序,希尔排序,归并排序

====================================================================

unity中摄像机的Clipping Planes的作用?
调整Near和Far两个值来剪裁平面,控制相机从开始渲染到结束渲染之间的距离.

====================================================================

GC垃圾回收的产生原因?
作用是回收堆上的内存.
减少new产生对象的次数;使用公共对象(静态成员);string适时用stringbuilder代替.

====================================================================

反射的实现原理?
审查元数据并收集关于它的类型信息的能力.
实现原理:在运行时根据程序集及其中的类型得到元数据.
下面是实现步骤:
using System.Reflection;
Assembly.Load("程序集") // 加载程序集,返回类型是一个Assembly
得到程序中所有类的名字
foreach(Type type in assembly.GetTypes())
{
string t = type.Name;
}
Type type = assembly.GetType("程序集.类名");
获取当前类的类型.
Activator.CreateInstance(type); 创建此类型的实例
MethodInfo mInfo = type.GetMethod("方法名"); 获取方法
mInfo.Invoke(null, 方法参数);

====================================================================

四元数和欧拉角的优点?
四元数用于表示旋转.
优点:
能进行增量旋转;避免万向锁;给定方位的表达方式有两种,互为负数(欧拉角有无数种表达方式)

====================================================================

移动相机应该放在哪个函数里?
LateUpdate中,在所有的Update结束之后才调用,防止相机已经推进了,但视角里还没有角色的空帧出现.

====================================================================

GPU处理图形流水线的过程?
顶点处理:这阶段GPU读取描述3D图形外观的顶点数据并根据顶点数据确定3D图形的形状和位置关系,建立3D图形的骨架.在支持DX8和DX9规格的GPU中,这些操作由硬件实现的VertexShader(顶点着色器)完成.
光栅化计算:显示器实际显示的图像是由像素点组成的,要将上面形成的图形的点和线通过算法转换到相应的像素点.把一个矢量图形转换为一系列像素点的过程称为光栅化.例如,一条数学表示的斜线段最终被转换成阶梯状的连续像素点.
纹理贴图:顶点单元生成的多边形只构成了3D物体的轮廓,而纹理映射(texture mapping)工作完成对多边形表面的贴图,通俗地说就是将多边形的表面贴上对应的图片,从而生成“真实”的图形.TMU(Texture mapping unit)即是用来完成此项工作的.
像素处理:这个阶段(在对每个像素进行光栅化处理期间)GPU完成对像素的计算和处理,从而确定每个像素的最终属性.在支持DX8和DX9规格的GPU中,这些工作由硬件实现的Pixel Shader(像素着色器)完成.
最终输出:由ROP(光栅化引擎)最终完成像素的输出,1帧渲染完毕后,被送到显存帧缓冲区.
总结:
GPU的工作通俗来说就是完成3D图形的生成,将图形映射到相应的像素点上,对每个像素进行计算确定最终颜色并完成输出.

====================================================================

渲染管道?
指在显示器上为了显示出图像而经过的一系列必要操作. 渲染管道中的很多步骤,都要将几何体从一个坐标系变换到另一个坐标系中去.
主要步骤:
本地坐标 -> 视图坐标 -> 背面裁剪 -> 光照 -> 裁剪 -> 投影 -> 视图变换 -> 光栅化

====================================================================

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

====================================================================

动态加载资源的方式?二者的区别?
1)Resources.Load()
把资源放在Resouces命名的文件夹下,该文件夹下的不管是否有用到都用打包进安装包中.对游戏的分包发布(微端)和版本升级(patch)是不利的.
2)AssetBundle
将资源打包成ab包放在服务器或本地磁盘中,用WWW模块下载下来,然后从这个bundle中load某个资源.便于分包发布和patch.
3)AssetDatabase.loadasset
只在editor范围内有效,运行时没有该函数,通常是在开发中调试用的[AssetDatabase资源数据库],在开发的
4)untiy的StreamingAsset文件夹,通过Application.streamingAssetsPaath来得到.
类似的有Application.dataPath/consoleLogPath/persistentDataPath/temporaryCachePath/streamingAssetsPath (参考: https://blog.csdn.net/ynnmnm/article/details/52253674)

====================================================================

动画原理?[关节动画、骨骼动画、单一网格模型动画(关键帧动画)]
关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活.
骨骼动画:按角色特点组成一定的层次结构,由关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观.
单一网格模型动画:由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实.

====================================================================

alpha blend 工作原理
https://blog.csdn.net/candycat1992/article/details/41599167

====================================================================

光照计算diffuse的计算公式
diffuse = Kd * colorLight * max(NL, 0);
// Kd 漫反射系数, colorLight 光的颜色, N 单位法线向量、 L由点指向光源的单位向量、
// 其中 N与L 点乘,如果结果小于0,则漫反射为 0.

====================================================================

两种阴影判断的方法、工作原理。
本影和半影:参考本影和半影
本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)。
半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域(半明半暗区域)
工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后再按视点位置对场景进行相应处理得到所要求的视图(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)

====================================================================

Vertex Shader
顶点着色器是一段执行在GPU上的程序,用来取代fixed pipeline 中的transformation和lighting,Vertex Shader主要操作顶点.
Vertex Shader对输入顶点完成了从local space到homogenous space(齐次空间)的变换过程, homogeneous space 即projection space的下一个space. 在这期间共有 world transformation,view transformation 和 projection transformation 及 lighting 几个过程.

====================================================================

代码题.下面代码为什么产生运行时错误
List ls = new List(new int[] { 1, 2, 3, 4, 5 });
foreach (int item in ls) {
Console.WriteLine(item * item);
ls.Remove(item);
}
ls.Remove(item); 这行报错,因为foreach是只读的,不能在遍历的同时修改ls.

====================================================================

unity的多线程?
unity中只有主线程可以访问unity的组件、对象和unity系统的函数调用.
协程即StartCoroutine,当协程的函数体处理代码时,利用 yield等待执行结果,这期间不影响主线程的继续执行,可以协同工作.

====================================================================

矩阵相乘的意义
用于表示线性变换:旋转、缩放、投影、平移、仿射变换
注意矩阵的蠕变:误差的积累

====================================================================

为什么dynamic font 在 unicode环境下优于static font
unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案.
使用动态字体时,unity将不会预先生成一个所有字体的字符纹理.当需要支持亚洲语言或较大的字体时,若使用正常纹理,则字体的纹理将会非常大.

====================================================================

当一个细小的高速物体撞向一个较大的物体时发生穿透(碰撞检测失效)?
调节fixed Timestep,在 Edit -> Project Setting -> Time 调节 TimeManager 的 fixed Timestep

====================================================================

OnBecameVisible 和 OnBecameInvisible 的发生时机和用法?
当物体切换是否可见的时候.可以用于只需要在物体可见时进行的计算.

====================================================================

动态合批和静态合批的区别?
如果动态物体有着相同的材质,那么unity会自动对这些物体进行批处理.动态批处理操作是自动完成的,不需要人工额外操作.
区别:
动态合批处理一切都是自动的,不需要任何操作,而且物体是可以移动的,但是限制很多.
静态批处理自由度很高,限制很少,缺点会占用更多内存,而且经过静态合批之后的所有物体都不能再移动了.
参考:http://gad.qq.com/article/detail/31482

====================================================================

shader分类及区别?
Surface Shader表面着色器:
抽象层级较高,可以轻松简洁的实现复杂着色.表面着色器可以同时在前向渲染及延迟渲染模式下正常工作.
顶点片段着色器:
可以非常灵活地实现需要的效果,但是需要编写更多的代码,并且很难与unity的渲染管线完美集成.
固定功能管线着色器:
可以作为前两种着色器的备用选择,当硬件无法运行那些酷炫的shader时,可以通过固定管线着色器来绘制一些基本内容.

====================================================================

C#的四种访问修饰符区别?
属性修饰符:
[Serializable] 按值将对象封装送给远程服务器
[STAThread] Single Thread Apartment Thread 单一线程单元模型
[MTAThread] Multiple ... 多线程单元模型
存取修饰符:
public 存取不受限制
private 只有包含改成员的类可以存取
internal 只有当前工程可以存取
protected 只有该类及其派生类可以存取.
类修饰符:
abstract 抽象类,不能实例化.
sealed 密封类,该类不能被继承.
成员修饰符:
abstract 抽象方法;抽象方法必须在抽象类
sealed 密封方法,如下
class A
{
public virtual void F()
{
Console.WriteLine("A.F");
}
public virtual void G()
{
Console.WriteLine("A.G");
}
}
class B : A
{
public sealed override void F() // 将虚方法F加上sealed密封起来
{
Console.WriteLine("B.F");
}
}
class C : B
{
// 不能再重写F方法了
}
delegate 委托,定义一个函数指针.C#中的事件驱动是基于delegate + event的.
const 常量属性,该成员的值只读不允许修改.
event 声明一个事件.
extern 表示方法是外部实现的,如下
[DllImport("xxx.dll")]
public static extern int Method1111(int a);
override 重写基类的方法.
readonly 只读属性,只能在声明时赋值.
static 类属性.
virtual 表示该方法或存取器(get set)可以在派生类中被重写.
new 显示隐藏从基类中继承的成员.
class A {
protected string name111;
protected void Method111() {
// ....
}
}
class B : A {
protected new string name111; // 重新定义了name111
protected new void Method111() {
// ...
}
}

====================================================================

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

====================================================================

Mock测试和Stub测试的区别?

====================================================================

unity中查看场景的面数、顶点数和Draw Call数?如何降低 DrawCall数?
在Game视图右上角点击status,降低Draw Call的技术是Draw Call Batching,在Profiler面板查看.

====================================================================

AlphaTest 的效果?
透明度测试是在Vertex&Fragment Shader中最后fragment 函数输出该点的颜色的alpha值与固定值进行比较.
AlphaTest语句通常在Pass{}中的起始位置,Alpha Test产生的效果很极端,要么完全透明,即看不见,要么完全不透明.

====================================================================

unity在移动设备上的一些优化资源的方法?
使用asset bundle,实现资源分离和共享,将内存控制在200mb以内,同时也可以实现资源的在线更新.
顶点数对渲染无论cpu还是gpu都是压力的最大贡献者,降低顶点数到八万以下.
只使用一盏动态光,不使用阴影,不使用光照探头.
粒子系统是cpu的大头,剪裁粒子系统,合并同时出现的粒子系统,自己实现轻量级的粒子系统.
除主角外都不要用骨骼运动apply root motion.
代码剪裁使用strip level

====================================================================

有AB两组物体,如何保证A组物体永远比B组物体先渲染?
把A组物体的渲染队列大于B组物体的,通过shader里面的渲染队列来渲染.

====================================================================

图片的TextureType选项分辨选为Texture和Sprite的区别?
Sprite作为UI精灵使用,Texture作为模型贴图使用.Sprite需要2的整数次幂,打包图片省资源.

====================================================================

Unity的Shader中,Blend SrcAlpha OneMinusSrcAlpha的意思?
作用是Alpha混合. 公式: 最终颜色 = 源颜色 * 源透明值 + 目标颜色 * (1 - 源透明值);

====================================================================

水面倒影的渲染?
对水面的贴图纹理进行扰动,以产生波光的效果.用shader 可以通过GPU在像素级别扰动,需要的顶点少,速度快

====================================================================

能用foreach遍历访问的对象需要实现接口或声明的方法类型?
IEnumerable; GetEnumerator

posted on 2019-02-12 15:05  Sweet小马  阅读(280)  评论(0编辑  收藏  举报

导航