是指在显示器上为了显示出图像而经过的一系列必要操作。 渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。 主要步骤有: 本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化。 二.如何优化内存? 有很多种方式,例如 1.压缩自带类库; 2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉; 3.释放AssetBundle占用的资源; 4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;
5.使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。
在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足。
碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器
两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体,而且必须是运动的物体带有Rigidbody脚本才能检测到碰撞。
####ArrayList存在不安全类型(ArrayList会把所有插入其中的数据都当做Object来处理) 装箱拆箱的操作(费时) List是接口,ArrayList是一个实现了该接口的类,可以被实例化
1.将Assets目录和Library目录一起迁移
2.导出包,export Package
3.用unity自带的assets Server功能
九:OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中反复的发生
Awake –>OnEnable->Start,OnEnable在同一周期中可以反复地发生。
修改sharedMaterial将改变所有物体使用这个材质的外观,并且也改变储存在工程里的材质设置。不推荐修改由sharedMaterial返回的材质。如果你想修改渲染器的材质,使用material替代。
四种。
平行光:Directional Light
点光源:Point Light
聚光灯:Spot Light
区域光源:Area Light
对象池就存放需要被反复调用资源的一个空间,当一个对象回大量生成的时候如果每次都销毁创建会很费时间,通过对象池把暂时不用的对象放到一个池中(也就是一个集合),当下次要重新生成这个对象的时候先去池中查找一下是否有可用的对象,如果有的话就直接拿出来使用,不需要再创建,如果池中没有可用的对象,才需要重新创建,利用空间换时间来达到游戏的高速运行效果,在FPS游戏中要常被大量复制的对象包括子弹,敌人,粒子等
Rigidbody具有完全真实物理的特性,Unity中物理系统最基本的一个组件,包含了常用的物理特性,而CharacterController可以说是受限的的Rigidbody,具有一定的物理效果但不是完全真实的,是Unity为了使开发者能方便的开发第一人称视角的游戏而封装的一个组件
在游戏运行时实例化,prefab相当于一个模板,对你已经有的素材、脚本、参数做一个默认的配置,以便于以后的修改,同时prefab打包的内容简化了导出的操作,便于团队的交流。
public:对任何类和成员都公开,无限制访问
private:仅对该类公开
protected:对该类和其派生类公开
internal:只能在包含该类的程序集中访问该类
1. 使用本身的GUI,在Unity4.6以后出现的UGUI
2.把摄像机的Projection(投影)值调为Orthographic(正交投影),不考虑z轴;
3.使用2d插件,如:2DToolKit,和NGUI
Hinge Joint,可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。
Awake——>OnEnable–>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>OnDisable——>OnDestroy
FixedUpdate,每固定帧绘制时执行一次,和Update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。
游戏界面可以看到很多摄像机的混合。
使用Destroy()方法;
一般是组件上绑定的物体对象被删除了
LOD(Level of detail)多层次细节,是最常用的游戏优化技术。它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。缺点是增加了内存。
MipMapping:在三维计算机图形的贴图渲染中有常用的技术,为加快渲染进度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为MipMap。
抽象类表示该类中可能已经有一些方法的具体定义,但接口就是公公只能定义各个方法的界面 ,不能具体的实现代码在成员方法中。类是子类用来继承的,当父类已经有实际功能的方法时该方法在子类中可以不必实现,直接引用父类的方法,子类也可以重写该父类的方法。实现接口的时候必须要实现接口中所有的方法,不能遗漏任何一个。
mono是.net的一个开源跨平台工具,就类似java虚拟机,java本身不是跨平台语言,但运行在虚拟机上就能够实现了跨平台。.net只能在windows下运行,mono可以实现跨平台跑,可以运行于linux,Unix,Mac OS等。
Unity的脚本语言基于Mono的.Net平台上运行,可以使用.NET库,这也为XML、数据库、正则表达式等问题提供了很好的解决方案。Unity里的脚本都会经过编译,他们的运行速度也很快。这三种语言实际上的功能和运行速度是一样的,区别主要体现在语言特性上。JavaScript、 C#、Boo
Transform 父类是 Component
1.点乘描述了两个向量的相似程度,结果越大两向量越相似,还可表示投影
2.叉乘得到的向量垂直于原来的两个向量
3.标准化向量:用在只关系方向,不关心大小的时候
NGUI很好的解决了这一点,屏幕分辨率的自适应性,原理就是计算出屏幕的宽高比跟原来的预设的屏幕分辨率求出一个对比值,然后修改摄像机的size。UGUI通过锚点和中心点和分辨率也解决这个问题
LightMap:就是指在三维软件里实现打好光,然后渲染把场景各表面的光照输出到贴图上,最后又通过引擎贴到场景上,这样就使物体有了光照的感觉。
1. Unity3D支持C#、javascript等,cocos2d-x 支持c++、Html5、Lua等。
2. cocos2d 开源 并且免费
3. Unity3D支持iOS、Android、Flash、Windows、Mac、Wii等平台的游戏开发,cocos2d-x支持iOS、Android、WP等。
结构体是一种值类型,而类是引用类型。(值类型、引用类型是根据数据存储的角度来分的)就是值类型用于存储数据的值,引用类型用于存储对实际数据的引用。那么结构体就是当成值来使用的,类则通过引用来对实际数据操作
ref和out参数的效果一样,都是通过关键字找到定义在主函数里面的变量的内存地址,并通过方法体内的语法改变它的大小。不同点就是输出参数必须对参数进行初始化。ref必须初始化,out 参数必须在函数里赋值。ref参数是引用,out参数为输出参数。
委托类似于一种安全的指针引用,在使用它时是当做类来看待而不是一个方法,相当于对一组方法的列表的引用。用处:使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的。
选择排序,冒泡排序,快速排序,插入排序,希尔排序,归并排序
射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。
剪裁平面 。从相机到开始渲染和停止渲染之间的距离。
void Awake()
GC回收堆上的内存
避免:1.减少new产生对象的次数
2.使用公用的对象(静态成员)
3.将String换为StringBuilder
审查元数据并收集关于它的类型信息的能力。实现原理:在运行时根据程序集及其中的类型得到元数据。下面是实现步骤:
3. 得到程序集中所有类的名称
四元数用于表示旋转
相对欧拉角的优点:
1.能进行增量旋转
2.避免万向锁
3.给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)
LateUpdate,是在所有的update结束后才调用,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是所有的update操作完才进行摄像机的跟进,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。
简而言之,GPU的图形(处理)流水线完成如下的工作:(并不一定是按照如下顺序) 顶点处理:这阶段GPU读取描述3D图形外观的顶点数据并根据顶点数据确定3D图形的形状及位置关系,建立起3D图形的骨架。在支持DX8和DX9规格的GPU中,这些工作由硬件实现的Vertex Shader(定点着色器)完成。 光栅化计算:显示器实际显示的图像是由像素组成的,我们需要将上面生成的图形上的点和线通过一定的算法转换到相应的像素点。把一个矢量图形转换为一系列像素点的过程就称为光栅化。例如,一条数学表示的斜线段,最终被转化成阶梯状的连续像素点。 纹理帖图:顶点单元生成的多边形只构成了3D物体的轮廓,而纹理映射(texture mapping)工作完成对多变形表面的帖图,通俗的说,就是将多边形的表面贴上相应的图片,从而生成“真实”的图形。TMU(Texture mapping unit)即是用来完成此项工作。 像素处理:这阶段(在对每个像素进行光栅化处理期间)GPU完成对像素的计算和处理,从而确定每个像素的最终属性。在支持DX8和DX9规格的GPU中,这些工作由硬件实现的Pixel Shader(像素着色器)完成。 最终输出:由ROP(光栅化引擎)最终完成像素的输出,1帧渲染完毕后,被送到显存帧缓冲区。
总结:GPU的工作通俗的来说就是完成3D图形的生成,将图形映射到相应的像素点上,对每个像素进行计算确定最终颜色并完成输出。
是指在显示器上为了显示出图像而经过的一系列必要操作。 渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。主要步骤有:
本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化
有很多种方式,例如
1.压缩自带类库;
2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉;
3.释放AssetBundle占用的资源;
4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;
5.使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。
6.代码中少产生临时变量
主要有关节动画、骨骼动画、单一网格模型动画(关键帧动画)。
关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画;
骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观;
单一网格模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。
Alpha Blend 实现透明效果,不过只能针对某块区域进行alpha操作,透明度可设。
diffuse = Kd x colorLight x max(N*L,0);Kd 漫反射系数、colorLight 光的颜色、N 单位法线向量、L 由点指向光源的单位向量、其中N与L点乘,如果结果小于等于0,则漫反射为0。
本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)。
半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域(半明半暗区域)
工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后再按视点位置对场景进行相应处理得到所要求的视图(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)
顶点着色器是一段执行在GPU上的程序,用来取代fixed pipeline中的transformation和lighting,Vertex Shader主要操作顶点。
Vertex Shader对输入顶点完成了从local space到homogeneous space(齐次空间)的变换过程,homogeneous space即projection space的下一个space。在这其间共有world transformation, view transformation和projection transformation及lighting几个过程。
string a = new string("abc");
在C#中第一行是会报错的(Java中倒是可行)。
应该这样初始化:
答案为:5个临时对象
List<int> ls = new List<int>(new int[] { 1, 2, 3, 4, 5 });
foreach (int item in ls)
仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用
支持:如果同时你要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine。
多线程程序同时运行多个线程 ,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。除主线程之外的线程无法访问Unity3D的对象、组件、方法。
Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。
用于表示线性变换:旋转、缩放、投影、平移、仿射
注意矩阵的蠕变:误差的积累
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。
使用动态字体时,Unity将不会预先生成一个与所有字体的字符纹理。当需要支持亚洲语言或者较大的字体的时候,若使用正常纹理,则字体的纹理将非常大。
穿透(碰撞检测失败)
当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算。
如果动态物体共用着相同的材质,那么Unity会自动对这些物体进行批处理。动态批处理操作是自动完成的,并不需要你进行额外的操作。
区别:动态批处理一切都是自动的,不需要做任何操作,而且物体是可以移动的,但是限制很多。静态批处理:自由度很高,限制很少,缺点可能会占用更多的内存,而且经过静态批处理后的所有物体都不可以再移动了。
String是字符串常量。
StringBuffer是字符串变量 ,线程安全。
StringBuilder是字符串变量,线程不安全。
String类型是个不可变的对象,当每次对String进行改变时都需要生成一个新的String对象,然后将指针指向一个新的对象,如果在一个循环里面,不断的改变一个对象,就要不断的生成新的对象,所以效率很低,建议在不断更改String对象的地方不要使用String类型。
StringBuilder对象在做字符串连接操作时是在原来的字符串上进行修改,改善了性能。这一点我们平时使用中也许都知道,连接操作频繁的时候,使用StringBuilder对象。
表面着色器的抽象层次比较高,它可以轻松地以简洁方式实现复杂着色。表面着色器可同时在前向渲染及延迟渲染模式下正常工作。
顶点片段着色器可以非常灵活地实现需要的效果,但是需要编写更多的代码,并且很难与Unity的渲染管线完美集成。
固定功能管线着色器可以作为前两种着色器的备用选择,当硬件无法运行那些酷炫Shader的时,还可以通过固定功能管线着色器来绘制出一些基本的内容。
char * strcpy(char * strDest,const char * strSrc)
if ((strDest==NULL)||(strSrc==NULL))
throw "Invalid argument(s)";
char * strDestCopy=strDest;
while ((*strDest++=*strSrc++)!='\0');
return strDestCopy;
1.属性修饰符 2.存取修饰符 3.类修饰符 4.成员修饰符。
属性修饰符:
Serializable:按值将对象封送到远程服务器。
STATread:是单线程套间的意思,是一种线程模型。
MATAThread:是多线程套间的意思,也是一种线程模型。
存取修饰符:
public:存取不受限制。
private:只有包含该成员的类可以存取。
internal:只有当前工程可以存取。
protected:只有包含该成员的类以及派生类可以存取。
类修饰符:
abstract:抽象类。指示一个类只能作为其它类的基类。
sealed:密封类。指示一个类不能被继承。理所当然,密封类不能同时又是抽象类,因为抽象总是希望被继承的。
成员修饰符:
abstract:指示该方法或属性没有实现。
sealed:密封方法。可以防止在派生类中对该方法的override(重载)。不是类的每个成员方法都可以作为密封方法密封方法,必须对基类的虚方法进行重载,提供具体的实现方法。所以,在方法的声明中,sealed修饰符总是和override修饰符同时使用。
delegate:委托。用来定义一个函数指针。C#中的事件驱动是基于delegate + event的。
const:指定该成员的值只读不允许修改。
extern:指示方法在外部实现。
override:重写。对由基类继承成员的新实现。
static:指示一个成员属于类型本身,而不是属于特定的对象。即在定义后可不经实例化,就可使用。
virtual:指示一个方法或存取器的实现可以在继承类中被覆盖。
1.值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。
2.值类型存取速度快,引用类型存取速度慢。
3.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用
5.栈的内存分配是自动释放;而堆在.NET中会有GC来释放
6.值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
递归实现:
int Fib1(int index)
if(index
迭代实现:
int Fib5(int index)
if(index
function Start() {
// 协同程序WaitAndPrint在Start函数内执行,可以视同于它与Start函数同步执行.
StartCoroutine(WaitAndPrint(2.0));
function WaitAndPrint (waitTime : float) {
// 暂停执行waitTime秒
yield WaitForSeconds (waitTime);
作用:一个协同程序在执行过程中,可以在任意位置使用yield语句。yield的返回值控制何时恢复协同程序向下执行。协同程序在对象自有帧执行过程中堪称优秀。协同程序在性能上没有更多的开销。
缺点:协同程序并非真线程,可能会发生堵塞。
里氏替换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。通俗点:就是子类对象可以赋值给基类对象,基类对象不能赋值给子类对象
Mock与Stub的区别:Mock:关注行为验证。细粒度的测试,即代码的逻辑,多数情况下用于单元测试。Stub:关注状态验证。粗粒度的测试,在某个依赖系统不存在或者还没实现或者难以测试的情况下使用,例如访问文件系统,数据库连接,远程协议等。
序列化简单理解成把对象转换为容易传输的格式的过程。比如,可以序列化一个对象,然后使用HTTP通过Internet在客户端和服务器端之间传输该对象
栈通常保存着我们代码执行的步骤,如在代码段1中 AddFive()方法,int pValue变量,int result变量等等。而堆上存放的则多是对象,数据等。我们可以把栈想象成一个接着一个叠放在一起的盒子。当我们使用的时候,每次从最顶部取走一个盒子。栈也是如此,当一个方法(或类型)被调用完成的时候,就从栈顶取走,接着下一个。堆则不然,像是一个仓库,储存着我们使用的各种对象等信息,跟栈不同的是他们被调用完毕不会立即被清理掉。
代理就是用来定义指向方法的引用。
C#事件本质就是对消息的封装,用作对象之间的通信;发送方叫事件发送器,接收方叫事件接收器
socket通常也称作”套接字”,实现服务器和客户端之间的物理连接,并进行数据传输,主要有UDP和TCP两个协议。Socket处于网络协议的传输层。
Unity可以到处Android和iOS的工程,然后通过安卓或者iOS的类去给Unity发消息,调用Unity中的方法
在Game视图右上角点击Stats。降低Draw Call 的技术是Draw Call Batching
这个在5.0以后在window-》Profiler下面,快捷键是cmd + 7(ctl + 7
Alpha Test ,中文就是透明度测试。简而言之就是V&F shader中最后fragment函数输出的该点颜色值(即上一讲frag的输出half4)的alpha值与固定值进行比较。AlphaTest语句通常于Pass{}中的起始位置。Alpha Test产生的效果也很极端,要么完全透明,即看不到,要么完全不透明。
1.使用assetbundle,实现资源分离和共享,将内存控制到200m之内,同时也可以实现资源的在线更新
2.顶点数对渲染无论是cpu还是gpu都是压力最大的贡献者,降低顶点数到8万以下,fps稳定到了30帧左右
3.只使用一盏动态光,不是用阴影,不使用光照探头
粒子系统是cpu上的大头
4.剪裁粒子系统
5.合并同时出现的粒子系统
6.自己实现轻量级的粒子系统
animator也是一个效率奇差的地方
7.把不需要跟骨骼动画和动作过渡的地方全部使用animation,控制骨骼数量在30根以下
9.删除无意义的animator
11.除主角外都不要跟骨骼运动apply root motion
12.绝对禁止掉那些不带刚体带包围盒的物体(static collider )运动
NUGI的代码效率很差,基本上runtime的时候对cpu的贡献和render不相上下
13每帧递归的计算finalalpha改为只有初始化和变动时计算
14去掉法线计算
15不要每帧计算viewsize 和windowsize
17.代码剪裁:使用strip level ,使用.net2.0 subset
18.尽量减少smooth group
19.给美术定一个严格的经过科学验证的美术标准,并在U3D里面配以相应的检查工具
对旋转角度进行计算时用到四元数
如果把摄像机的ClearFlags勾选为Deapth Only,那么摄像机就会只渲染看得见的对象,把背景会完全透明,这种情况一般用在两个摄像机以上的场景中
设置游戏对象为Static时,这些部分被静态物体挡住而不可见时,将会剔除(或禁用)网格对象。因此,在你的场景中的所有不会动的物体都应该标记为Static。
把A组物体的渲染对列大于B物体的渲染队列,通过shader里面的渲染队列来渲染
Sprite作为UI精灵使用,Texture作用模型贴图使用。Sprite需要2的整次幂,打包图片省资源
没有区别,因为不管几张贴图只渲染一次。
Unity中,每次引擎准备数据并通知GPU的过程称为一次Draw Call。DrawCall越高对显卡的消耗就越大。降低DrawCall的方法:
1. Dynamic Batching
2. Static Batching
3. 高级特性Shader降级为统一的低级特性的Shader。
可以有cookies – 带有 alpha通道的立方图(Cubemap )纹理。点光源是最耗费资源的。
作用就是Alpha混合。公式:最终颜色 = 源颜色 x 源透明值 + 目标颜色 x(1 - 源透明值)
原理就是对水面的贴图纹理进行扰动,以产生波光玲玲的效果。用shader可以通过GPU在像素级别作扰动,效果细腻,需要的顶点少,速度快
对Grid和Table下的子物体进行排序和定位
1. 只要提供一个half-pixel偏移量,它可以让一个控件的位置在Windows系统上精确的显示出来(只有这个Anchor的子控件会受到影响)
2. 如果挂载到一个对象上,那么他可以将这个对象依附到屏幕的角落或者边缘
IEnumerable;GetEnumerator
外部视频文件:目前测试仅支持ogg格式(设置网络获取视频时,必须将MIME设置.ogg为application/octet-stream)
场景设置:MainCamera上添加AudioSource脚本;播放物体上(如Plane)添加MovieTest脚本
MovieTest脚本:
using UnityEngine;
public class MovieTest : MonoBehaviour
//视频纹理
protected MovieTexture movTexture;
AudioClip audio;
AudioSource AudioSource1;
void Start()
StartCoroutine(DownLoadMovie());
void OnGUI()
//播放/继续播放视频
//暂停播放
//停止播放
IEnumerator DownLoadMovie()
yield return www;
//获取主相机的声源
//获取视频的声音设置到声源上
//设置当前对象的主纹理为电影纹理
//设置电影纹理播放模式为循环
FXMaker,制作粒子特效;NGUI,制作2D界面;EasyTouch,摇杆;shaderForge,制作shader;Itween,制作动画;
会导致在场景中游戏对象看不到,或者报错,材质找不到资源。多人协作的时候会导致资源的重复产生。因为每个资源文件都对应一个.meta文件,这个.meta文件中的guid就是唯一标识这个资源的。材质就是通过这个guid来记录自己使用了那些资源,而且同一个资源的guid会因为不同的电脑而不同,所以当你上传了丢失了.meta文件的资源的时候,到了别人的机器上就会重新产生guid,那个这个资源就相当于垃圾了。
频繁创建游戏对象,会增加游戏的Drawcall数,降低帧率,GPU会一直在渲染绘制。可以通过对象池来管理对象:当需要创建一个游戏对象时,先去对象池中查找一下对象池中是否存在没有被正在使用的对象,如果有的话直接使用这个对象,并把它标记为正在使用,没有话就创建一个,并把它添加到池中,然后标记为使用中。一个游戏对象使用完毕的时候,不要销毁掉,把它放在池中,标记为未使用。
初始化服务器。connections是允许的入站连接或玩家的数量,listenPort是要监听的端口,useNat设置NAT穿透功能。如果你想要这个服务器能够接受连接使用NAT穿透,使用facilitator,设置这个为true。如果有错误会有返回错误。
delegate b Func<a, b>(a a1);
static void Main(string[] args)
Func<int, bool> mFunc = x => x == 5;
false,就是定义一个delegate,返回值类型为 b,有一个参数,类型为a。
uint BitCount (uint n)
uint c = 0; // 计数器
while (n > 0) {
if ((n & 1) == 1) // 当前位是1
++c; // 计数器加1
n >>= 1; // 移位
return c;
public Transform GetChild(int index);
public void OutputTree(Transform root)
ACID是指在可靠数据库管理系统(DBMS)中,事务所具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。例如:对银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNT表中aaa和bbb的存款总额为2000元。
隔离性多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。这指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。
持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。即使出现了任何事故比如断电等,事务一旦提交,则持久化保存在数据库中。
预编译-》编译-》链接-》执行
三次握手;
unsigned int getN(unsigned int v){
v--;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
v++;
return v;
返回的结果是v 或者 2 ^ 跟下v次方 + 1(比如125返回128,128返回的就是128)
static 关键字至少有下列几个作用:
(1)函数体内static 变量的作用范围为该函数体,不同于auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
(2)在模块内的static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(4)在类中的static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
(5)在类中的static 成员函数属于整个类所拥有,这个函数不接收this 指针,因而只能访问类的static 成员变量。
在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足。
2.当游戏中需要频繁创建一个物体时,使用Prefab能够节省内存。
3.当你在一个场景中增加一个Prefabs,你就实例化了一个Prefabs。
1.请问这个脚本分别会按顺序调用哪些函数,并列出哪些函数是反复进去的
2.请问当这个实例化对象先调用了SetActive(false),然后又调用了SetActive(true),那么这个脚本依次会调用哪些函数方法?
第一种合适,因为第二种会占用更多内存。
DestroyImmeditate 销毁对象的时候,会立即释放资源。Destroy只是从该场景销毁,但是还在内存当中。
1.通过Resources模块,调用它的load函数:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不关有没有场景引用,都会将其全部打入到安装包中。
2.通过bundle的形式:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object。
int func(int n)
if(n<=2) return 1;
return n + func(n-1);
s = a;
for(b = 1; b <= c; b++)
s = s + 1;
static 关键字至少有下列几个作用:
(1)函数体内static 变量的作用范围为该函数体,不同于auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
(2)在模块内的static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(4)在类中的static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
(5)在类中的static 成员函数属于整个类所拥有,这个函数不接收this 指针,因而只能访问类的static 成员变量。
const 关键字至少有下列几个作用:
(1)欲阻止一个变量被改变,可以使用const 关键字。在定义该const 变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;
(4)对于类的成员函数,若指定其为const 类型,则表明其是一个常函数,不能修改类的成员变量
(5)对于类的成员函数,有时候必须指定其返回值为const 类型,以使得其返回值不为“左值”。
int s = 0;
for(int i = 1; i <= num; i++)
s += JieCheng(num);
public int JieCheng(int num)
if(num < 0)
return;
if(num <=1)
return 1;
else {
return num * JieCheng(num - 1)
int GetResult(char[] input, char[] output)
int i, j, k = 0;
int flag;
int length;
if(input == NULL || output == NULL)
return -1;
length=strlen(input);//求数组的长度
for(i = 0; i<length; i++)
flag = 1;
for(j = 0; j < i; j++)
if(output[j] == input [i])
flag = 0;
if(flag)
output[k++] = input[i];
printf("最终的字符串为:");
output[k] = '\0';
print (output [m]);
return 0;
第三部分
A.点光源 B.方向光 C.聚光灯 D.日光灯
B.由Prefab实例出的GameObject,其在Hierarchy试图中表现为蓝色
D.实例出的GameObject上的组件信息一经改变,其对应出的Prefab也会自动改变
A.在Project窗口中选中一个Asset,右键->Create->Label
B.在Project窗口中选中一个Asset,右键->Add Label
C.在Project窗口中选中一个Asset,在Inspector窗口中点击添加Label的图标
D.在Project窗口中选中一个Asset,在Inspector窗口中点击按钮“Add Label”
A指定身体的某一部分是否参与骨骼动画
B.指定身体的某一部分是否参与物理模拟
C.指定身体的某一部分是否可以输出骨骼信息
D.指定身体的某一部分是否参与渲染
A.使用光照贴图比使用实时光源渲染要快
B.可以降低游戏内存消耗
C.可以增加场景真实感
D.多个物体可以使用同一张光照贴图
A.不用添加,任何时候都会自动生成
B.更改物体导入设置,勾选“Generate Lighting UVs”
C.更改物体导入设置,勾选“Swap UVs”
D.更改物体导入设置,在UVs选项中选择“Use Lightmaps”
作者:京东科技 王奕龙本文将详细介绍 ConcurrentHashMap 构造方法、添加值方法和扩容操作等源码实现。ConcurrentHashMap 是线程安全的哈希表,此哈希表的设计主要目的是在最小化更新操作对哈希表的占用,以保持并发可读性,次要目的是保持空间消耗与 HashMap 相同或更好,并支持利用多线程在空表上高效地插入初始值。在 Java 8 及之后的版本,使用 CAS 操作、 sy
1、简介小编最近在使用系统的时候,发现尽管应用已经使用了redis缓存提高查询效率,但是仍然有进一步优化的空间,于是想到了比分布式缓存性能更好的本地缓存,因此对领域内常用的本地缓存进行了一番调研,有早期的Guava缓存、在Guava上进一步传承的Caffine以及自称在Java中使用最广泛的EhCache,那么我们该怎么选择适合自己应用的缓存呢,小编下面会简单介绍,并将以上缓存进行一个对比,希望帮
摘要:本文以220和284的奇妙邂逅为引,探索了亲和数的神秘世界,并用C语言编织了一个寻找数字间“友谊”的程序。定义亲和数,指两个正整数中,彼此的全部约数之和(本身除外)与另一方相等比如220的所有因子之和(去除自身),为284284的所有因子和(去除自身),刚好也为220这样,我们就把它们两个称为一对亲和数 程序设计思路设循环数为i提取i的所有因数(除去自身),并将其求和,得到iSum提取iSu
一:什么是协同程序?在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足。二:Unity3d中的碰撞器和触发器的区别?碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollision...
1、面试方式:所有面试,只有3家有面试题,蓝港是其中之一,题量2-4页不等;其他都是1对1,2对1,或者3对1直接面试;主要考C#、unity基础,大公司问的不难,但问得深,基础必须扎实。 2、3D图形学、渲染:渲染管道流程、3D渲染优化,延迟渲染、Shader编程。 3、数学、数据结构:二维矩阵、三维矩阵相乘、转置;向量点乘和叉乘方法和意义;四元数、欧拉数;二叉树、堆...
前言最近学习了Unity中Avatar换装功能实现,参考了网上的几篇文章,总结了一个Demo。Unity的换装实现参考网上的教程,总体有两种实现,一种是官方Demo给出的合并Mesh实现, 还有一种采用的以前端游的做法,共享骨骼的方式。两种方式各有特点。个人Demo实现了以上两种做法。准备资源手头没有换装资源,所以用了官方Demo的资源作为示例,不过官方的Demo把切分的部件打包...
播放器设置 在播放器设置中,可以为将在 Unity 中构建的最终游戏定义各种参数(针对不同平台)。例如,其中有些值将在用于打开独立版游戏时启动的分辨率对话框 (Resolution Dialog)中,其他则在构建 iOS 设备游戏时用于 XCode,因此,准确地填写这些值非常重要。 如需查看播放器设置 (Player Settings),从菜单栏中选择编辑 (Edi...
[RequireComponent(typeof(Rigidbody))]强制指定的组件 [SerializeField, Range(0, 5)][SerializeField]场景视图中进行编辑[SerializeField,TooltipAttribute("説明文")]鼠标光标是在字段上,显示的说明文本。[SerializeField,Space(15)]设置字段和字段之...
动画类容:1.了解老版动画(Animation)播放2.熟悉新版动画的制作3.熟悉Animator Controller的使用4.了解动画中的BlendTree(混合树)5.动画中添加事件和遮罩6.动画IK(Inverse Kinematics)(反向运动学)一,介绍(Animation)动画播放添加 Animation 组件注意:组件上有 An...
unity优化方面主要有以下方面1、CPU2、GPU3、Memory4、other1、CPU(小心unityAPI里面带s的方法,比如Getcomponents等等会返回一个数组的API,大部分会带来GC Alloc)一、c#不良编码带来的GC Alloc。 Update、LaterUpdate函数的逻辑复杂。 序列化和反序列化的操作(Json、
Unity EventSystemMessage SystemInput ModulesSupported EventsRaycasters1. Message System(改进的消息系统)基本上可以看成是以前SendMessage的升级版。使用方法(照抄官网):step1. 声明一个接口,继承自IEventSystemHandlerpublic interface ICustomMessage
整个背包系统的系统图最后效果图:层级面板:在这里用到了资源商店的一个解析Json的插件,找一个免费的就行。资源面板:下面来介绍代码。物品基类。这个类是所有物品的基类,里面定义了一些属性,这些属性是所有物品都共有的,所有把他们抽象出来,里面还有2个构造方法、2个结构体和一个显示提示信息的方法。using UnityEngine;...
思路:1、手指头画的东西显示在屏幕上。 获取鼠标或者手指的坐标。 记录手指在屏幕的比例。 世界坐标系:以(0,0)坐标为参考物的记录的相对位置。 物体坐标系:以父类坐标为参考物的记录的相对位置。 相机坐标系:以相机坐标为参考物的记录的相对位置。 视图坐标系:左下角(0,0...
1、stairs 楼梯; 梯级; stair的复数。2、ditch 沟; 渠; 摆脱; 抛弃; 丢弃; 使在海上紧急降落; 迫降。3、incorporate 将…包括在内; 包含; 吸收; 使并入; 注册成立。4、fence 栅栏; 篱笆; 围栏; 障碍物; 买卖赃物者; 销赃犯; 围住,隔开; 参加击剑运动; 搪塞; 支吾。5、crate 大木箱,板条箱; 塑料分格箱,...
本文分享在学习编写shader过程中的语法知识由于我觉得我在代码中的注释很详细了,在这里我就直接贴代码,可以根据代码和注释了解shader编程Shader "LJL/ShaderText"//shader路径,不一定和shader文件名保持一致{ Properties//属性 { _Color("Color",Color)=(0,0,0,0) } //子shader,一个shader
我们知道,刚开始接触C语言编程,一般都是在一个.c或者.cpp(以下只说.c)的文件中编写代码,其中一定会有一个入口函数,也就是main()函数,你可以将程序代码全部写在main函数里,当然如果你想要程序更加模块化,也可以将一些操作写在一个函数里,这些函数的声明和定义也都是在main函数中。 想想,随着你的代码量越来越大,实现的功能越来越多,在一个.c文件中,你定义了许许多多的函数,这
在大数据时代,如何高效、可靠地处理海量数据成为企业面临的核心挑战。Lambda架构和Kappa架构作为两种主流的大数据处理架构,各有其设计哲学和应用场景。深入解析两种架构的设计原理和核心组件对比分析两种架构的优缺点提供实际应用案例和代码实现指导架构选型决策本文将从基础概念入手,逐步深入两种架构的核心原理,通过实际案例和代码实现展示具体应用,最后讨论未来发展趋势和选型建议。批处理(Batch Processing):对静态数据集进行大规模、高延迟的计算处理。