Invoke 延迟函数 和 Coroutine协程 和 Thread线程
Invoke:延迟函数,通过方法名延迟调用对应函数
注意:当此脚本或者当前脚本所在的游戏物体失活,延迟函数依然会执行;
但是当前脚本或者游戏物体被销毁,延迟函数就不会执行
协程,不同于多线程,它不是一个线程,依附于Unity主线程Unity中的协程由协程函数和协程调度器两部分构成。
协程函数使用的是C#的迭代器, 协程调度器则利用了MonoBehaviour中的生命周期函数来实现。
协程函数实现了分步, 协程调度器实现了分时.
注:因为协程分时分步执行的特性,当多个协程的耗时操作挤在同一时间执行也会造成卡顿。
应用场景1.www加载网络数据;2.异步加载资源,场景
挂载此脚本的组件和物体销毁,协程将不会执行;
物体失活协程不执行;组件失活协程执行。
协程和线程区别:
新开一个线程是独立的一个管道,和主线程并行执行;新开一个协程是在原线程之上开启,进行逻辑分时分步执行;
新开的线程无法访问Unity对象,无法使用unity中的api
新开的线程记得关闭 要不然会一直运行。
同一时间只能执行某个协程,同一时间可以同时执行多个线程
帧缓冲区(Frame buffer)
帧缓冲区也被叫做显存,它的作用是用来存储显卡芯片处理过或者即将提取的渲染数据。
帧缓冲可能是GPU专属内存,也可能是GPU和CPU共享内存,看硬件。
颜色缓冲区(Color buffer)
用于绘图的缓冲区,它包含了颜色索引或者RGBA颜色数据
深度缓冲区(Depth buffer)
与帧缓冲区对应,存储每个像素的深度值,通过深度缓冲区,我们可以进行深度测试。
当启动深度测试时,片段像素深度值和深度缓冲区深度值进行比较,从而确定像素的遮挡关系
保证渲染正确,决定片段哪些像素点数据可以替换到颜色缓冲区中。
模板缓冲区(Stencil buffer)
与颜色缓冲区和深度缓冲区类似,模板缓冲区可以为屏幕上的每个像素点保存一个无符号整数值。
这个值的具体意义视程序的具体应用而定。
在渲染的过程中,可以用这个值与一个预先设定的参考值相比较,根据比较的结果来决定是否更新相应的像素点的颜色值。
这个比较的过程被称为模板测试。模板测试发生在透明度测试(alpha test)之后,深度测试(depth test)之前。
如果模板测试通过,则相应的像素点更新,否则不更新。
模板缓冲区 用于规范颜色缓冲区 的运作范围
Image和RawImage,
Imgae比RawImage更消耗性能
Image只能使用Sprite属性的图片,但是RawImage什么样的都可以使用
Image适合放一些有操作的图片,裁剪平铺旋转什么的,针对Image Type属性
RawImage就放单独展示的图片就可以,性能会比Image好很多
Texture和Sprite有什么区别
Sprite作为UI精灵使用,Texture作用模型贴图使用。
alpha blend工作原理
Alpha Blend 实现透明效果,不过只能针对某块区域进行alpha操作,透明度可设。
Color = 原颜色*alpha/255+目标色*(255-alpha)/255
LOD 多层次细节处理技术
LOD多层次细节,是最常用的游戏优化技术。
它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
缺点:增加了内存
Text 和 TMPText的区别 优缺点
Text是像素渲染放大之后就会模糊,使用Text父物体的放大缩小会影响子物体Text的清晰度,
TMPText不会,它是网格渲染TMPText会把字体生成一个类似于贴图的东西然后读取贴图的坐标来获取对应的文字,
更换文字的消耗会比Text大。
TMPText更适用于不会变动的文字,特别是在量大的情况下,性能比Text高一些,需要经常变动的问题用Text好点,
TMPText在字体库很大的情况下查找更换会比较慢。
MeshRender中material和shader的区别?
MeshRender是模型渲染的组件,有此组件物体才能显示出来
Material是材质球,实际就是shader的实例,并进行赋值,贴图、纹理、颜色等。
Shader是着色器,实际上是一段程序,还可以用来实现一些仅靠贴图不容易实现的效果,如玻璃。
Shader大致分为:
1.表面着色器
2.顶点和片元着色器
3.固定功能着色器
MeshRender中material和 sharedmaterial的区别?
修改sharedMaterial将改变所有物体使用这个材质 的外观,并且也改变储存在工程里的材质设置。
不推荐修改由sharedMaterial返回的材质。如果你 想修改渲染器的材质,使用material替代。
当使用Renderer.material的时候,每次调用都会生成一个新的material到内存中去.
这在销毁物体的时候需要我们手动去销毁该material,否则会一直存在内存中。
也可以在场景替换的时候使用Resources.UnloadUnusedAssets去统一释放内存。
当使用Renderer.sharedMaterial的时候并不会生成新的material,而是直接在原material上修改,
并且修改后的设置就会被保存到项目工程中。一般不推荐使用这个去修改.
MeshRenderer 和 SkinnedMeshRenderer 和 Renderer
MeshRenderer 和 SkinnedMeshRenderer 都继承自Renderer类,两个类都和网格有关。
MeshRenderer 一般引用于没有动画的模型身上,比如建筑,石头,树木等。
SkinnedMeshRenderer 一般应用于具有蒙皮动画、表情动画的应用场景中。
MipMap
MipMap:为了加快渲染速度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件。
优点:优化显存带宽,用来减少渲染。因为可以根据距离摄像机远近,选择适合的贴图来渲染。所以UI不适用MipMap。
缺点:运行时占用更多内存,且增加包的容量。
什么是LightMap?
Unity的Lightmap是一种用于预计算光照信息的技术,可以提高场景的渲染效率和真实感。
使用Lightmap可以实现以下效果:
1.实时光照的替代:实时光照计算通常比较昂贵,尤其是在复杂的场景中。
通过预计算光照信息并将其存储在Lightmap中,可以避免在运行时进行实时光照计算,从而提高渲染性能。
2.高质量的间接光照:Lightmap可以捕捉到场景中物体之间的间接光照信息,包括反射和遮挡。
这可以增加场景的真实感,并在计算上比实时计算的间接光照更高效。
3.静态物体的持久光照效果:对于静态不变的物体,例如墙壁、地面等,
其光照信息可以在编辑器中进行烘焙,并在运行时保持不变。
这意味着即使在场景中移动相机或物体,它们的光照效果也会保持一致。
使用Unity的Lightmap需要以下步骤:
1.设置光照:在Unity编辑器中,可以选择合适的光照设置,包括光源类型、光源参数、间接光照参数等。
2.烘焙Lightmap:在编辑器中,可以选择进行Lightmap烘焙操作。
这将会将光照信息计算并存储在场景中的物体的纹理中。
3.应用Lightmap:在运行时,Unity会自动将Lightmap应用于相应的物体。
可以通过设置物体的渲染器组件来控制Lightmap的使用方式。
注意的是,Lightmap适用于静态不变的物体,例如墙壁、地面等。
对于动态或可移动的物体,可以使用实时光照计算技术,如实时阴影、实时全局光照等。
使用Lightmap可以提高场景的视觉效果和性能,并在静态物体上获得高质量的光照效果。
它在许多类型的游戏和应用程序中广泛应用,包括建筑可视化、虚拟现实、游戏开发等。
shader 分类
表面着色器的抽象层次比较高,
它可以轻松地以简洁方式实现复杂着色,表面着色器可同时在前向渲染及延迟渲染模式下正常工作。
顶点片段着色器可以非常灵活地实现需要的效果,但是需要编写更多的代码,并且很难与Unity的渲染管线完美集成。
固定功能管线着色器可以作为前两种着色器的备用选择,
当硬件无法运行哪些酷炫的Shader的时候,还可以通过固定功能管线着色器来绘制出一些基本的内容
Vertex Shader是什么,怎么计算?
Vertex Shader 中文意思就是顶点着色器,是一段执行在GPU上的程序,
用来取代fixed pipeline中的transformation和lighting,Vertex Shader主要操作顶点。
image.alphaHitTestMinimumThreshold
UGUI实现不规则图片点击(像素点击)的简单方法
1.开启图片的Read/Write Enabled
2.设置 image.alphaHitTestMinimumThreshold属性