参考
unity基础(1)——unity编辑器的基本介绍
Unity编辑器小提示和小技巧
unity编辑器十分好用的小技巧
Unity Tip小合集
有趣而又容易被忽略的Unity技巧
场景中如果有重叠的物体,标记禁选后,再去场景中拖动,就不会总是拖错目标了。
Scene视图的左上角把ShadingMode切换成Shaded Wireframe模式就能显示出模型的网格
有一些字段不想通过外部修改,因此声明为private,但是又有在运行时观察这些字段实时值的需求。这时我们就可以点击Inspector视窗右上角的下拉菜单,可以看到它和一般视窗的下拉菜单相比多了几个选项。
默认状况下,它处于Normal模式,我们这里就可以选择Debug模式了。这样,我们就可以既限制字段的访问权限又观察这些私有成员的变化了。
在某个数据上点击右键:
在Unity主界面中有三处是有搜索功能的,分别是:Hierarchy、Scene和Project。Hierarchy和Scene的搜索内容是一样的,都是对当前场景内的对象进行查找。Project是对整个Assets目录下的本地资源进行查找。有两种搜索模式可以使用:
有时我们需要将某个物体与另外一个物体对齐,特别是希望精确到顶点的形式对齐,通过输入坐标值的方式比较笨拙,我们可以用以下小技巧来快速进行对齐:
如果希望物体可以紧贴地面,但倾斜角度不好调整,这时可以在物体上添加Mesh Collider和Rigidbody组件,然后点击运行,借助Unity的物体引擎来计算位置。待物体坠落到地面后复制所有物体,停止运行后删除原先的物体再粘贴运行时复制的内容,并删除所有物体上的Mesh Collider和Rigidbody组件即可。
在安装位置找到Editor\Data\Resources\ScriptTemplates,更改模板即可
>
简化模型
最小化模型网格中的顶点和面的数量,避免复杂的网格。
使用纹理贴图代替复杂的网格
考虑用法线贴图对比高度贴图。法线贴图适用于伪造模型表面凸起和凹陷光照的简单纹理贴图。
高度贴图使用一张纹理来制作一种非常传统的3D表面几何图形。高度贴图比法线贴图优越是因为它们不仅定义了表面凸起和凹陷,而且提供了平行视差。作为一个着色器,它们的计算开销很大,只是没有网格的开销那么大。
限制需要绘制的对象
遮挡剔除(occlusion culling),在摄像机看不见对象时禁用对它们的渲染,因为它们被其他对象遮挡了。
Global Fog(迷雾限制),减少场景中细节渲染,其基于距离,比迷雾限制更远的对象将不会被绘制。
对细节分级或LOD分组,近处的物体用细节模型渲染,远处的模型则用简化的模型渲染,是一种简化几何对象的好方法。
光照和阴影的性能
节约使用实时光影,当某个对象投射阴影时会生成一个阴影贴图,它会被用于渲染其他可能接受阴影的对象。阴影有很高的渲染开销而且通常需要高端的GPU硬件。
其他技术如灯光探测器(实时或烘焙)和着色器的选择。
优化脚本
Update()回调函数每一帧都会被调用。移除不用的更新,使用一个状态变量和if语句在它们不需要时停止计算。内存管理,数学与物理。
批量处理
Unity是将不同的网格归类到一个单独的批处理中,这个批处理会被立即放进图形硬件。这比单独发送网格快很多。网格实际上先被编译进一个OpenGL顶点缓存对象或一个VBO,这是渲染流水线的低层细节。
每一个批处理调用一次绘制,在一个场景中减少调用绘制次数的比减少顶点或三角形的实际数量的效果更有意义。
共有两种类型的批处理——静态批处理和动态批处理
首先,确认在Player Settings中启用Static Batching和Dynamic Batching。
对于静态批处理,简单地通过在Unity的Inspector中为场景内的每个对象勾选Static复选框以标记对象为静态。把一个对象标记为静态是告诉它将永远不能移动,动画或缩放。Unity将自动把这些共享相同材质网格放在一起形成一个大网格。
共享相同材质的网格,所有这样的网格在一个批处理中必须有相同的材质设置——相同的纹理,着色器,着色参数及材质的指针对象。
对于动态批处理,那些没有标记为Static的对象,Unity将尝试把它们放进批处理,即使它会是一个更慢的过程,因为它需要考虑逐帧动画(CPU开销)。共享材质的需求依然存在,当然还有其他的限制,比如顶点个数(小于300个顶点)和统一的Transform Scale规则。只有Mesh Renderers和Particle Systems使用批处理,这意味着蒙皮网格,衣服,尾迹渲染以及其他一些类型的渲染组件并没有使用批处理。
多通道像素填充
多通道像素填充就是某些高级渲染器的工作方式。光照和材质效果,比如多光照,动态阴影及透明度(Trransparent和Fade Render模式)都是以这种方式实现的。
针对项目,可以选择优化并避免通道像素填充在一起,或者理解清楚什么样的场景需要高性能,什么样的场景需要高保真,需要仔细的策划这个场景。
使用Light Probes以很低的成本模拟动态对象的动态光照。
在Quality Settings中把同时发生的光照的全部数量设置为1。
其他渲染技巧
创建2048分辨率的纹理并导入到默认的1024的设置,这样可以加速渲染。
针对无阴影使用高质量的设置渲染到Android时,需要切换目标平台到PC,使用高分辨率烘焙光照并开启硬阴影和软阴影,再切换回Android。
针对低级设备的优化或将程序分为高低版本。
Unity内置的性能评估工具——Stats窗格和Profiler窗格
Game面板中可开启Stats窗格
CPU:获取到当前占用CPU进行计算的时间绝对值,或时间点,如果Unity主进程处于挂断或休眠状态时,CPU time将会保持不变。
Batches:即Batched Draw Calls,是Unity内置的Draw Call Batching技术。
什么叫做“Draw call”,CPU每次通知GPU发出一个 glDrawElements (OpenGl中的图元渲染函数)或者 DrawIndexedPrimitive (DirectX中的顶点绘制方法)的过程称为一次Draw call,一般来说,引擎每对一个物体进行一次DrawCall,就会产生一个Batch,这个Batch里包含着该物体所有的网格和顶点数据,当渲染另一个相同的物体时,引擎会直接调用Batch里的信息,将相关顶点数据直接送到GPU,从而让渲染过程更加高效,即Batching技术是将所有材质相近的物体进行合并渲染。
Tris:摄像机视野(field of view)内渲染的三角面总数量
Verts:摄像机视野(field of view)内渲染的顶点总数
Screen:当前Game屏幕的分辨率大小,58M表示总的内存使用数值
SetPass calls:描述渲染性能开销
Shadow casters:表示场景中有多少个可以投射阴影的物体,一般这些物体都作为场景中的光源。
visible skinned meshed:渲染皮肤网格的数量
Animations:正在播放动画的数量
Network:网络情况
Unity中的Profiler选项是一个性能探测工具,可以报告游戏中的哥哥区域花费的时长,包括渲染和脚本。它记录游戏中随着时间的统计数据并以时间线图表展现出来。点击可以逐帧查看细节
GICache是由全局照明(GI)系统用于存储中间文件时预计算实时GI和烘烤时的静态光照贴图,反射光探针和探针。缓存在计算机上的所有Unity项目之间共享,因此具有相同内容和相同版本的照明系统的项目可以共享文件并加快后续构建。
GICache被用于全局照明(GI)系统预计算实时GI 和 烘培静态光照贴图(baking Static LIghtmaps),反射光探针(Reflection Probes)和探针(Light Probes)中。
GICache在本地的所有Unity工程中共享,所以当各项目中有相同内容和相同版本的光照系统时可以直接共享,而不用重新构建
因为unity 的GI cache 默认在 C:\Users\lenovo\AppData\LocalLow\Unity\Caches\GiCache,处理方法,Edit-> Preferences->GI Cache->选中Custom cache location 复选框,选择一个空间大的目录即可,C盘的缓存记得删干净!
一个不透明或半透明物体的显示状态应该怎样确定?
一般在画画的时候:
首先将场景的多边形根据深度进行排序,然后按照顺序进行绘制
但是如果有半透明的东西呢?他们之间相互混合,也十分复杂
为了解决这些问题,计算机咋整呢?
深度缓冲区(Depth Buffer)
记录像素的深度信息,存储像素到摄像机的深度
每一帧开始前,深度缓冲区都会被清空。
当需要渲染新的像素时,像素的深度会预先被计算出来,比较这个像素的深度值与缓冲区中的值
通过算法判断是否要通过该像素,或需要在深度缓冲区中写入该像素的深度
在场景没有透明物体的情况下,我们可以按照缓冲区比较,无需对场景中的物体进行排序,也避免了重复绘制
既能解决重叠的问题,又可以带来性能的提升
但是有透明物体咋整呢?
如果透明物体A在不透明物体B前面,A离摄像机距离一定B更近
如果A写入了深度值,B就不会被绘制,自然也看不到半透明效果
引进了 渲染队列 的概念。
啥玩意是渲染队列?
也是按深度缓冲,但将不透明与半透明的物体分开
先渲染不透明的物体,对比起深度值,并将其深度值写入缓冲
然后再渲染半透明物体,只对比深度值,不写入缓冲(半透明物体之间使用深度值)
Unity中的预定义渲染队列(队列索引号越小,越早被渲染)
渲染队列-----------------渲染队列索引
Background------------------1000 (skybox已经不在这里了)
Geometry---------------------2000
AlphaTest---------------------2450
Transparent------------------3000
Overlay------------------------4000
使用渲染队列后也会有一些问题
如果相互穿插,就没有办法得到正确的排序,进而得到错误的颜色值
解决方法:
1拆分或优化模型的形状,降低穿插
2调整混合参数,看起来不那么明显
3预先深度Pass(Pre Depth Pass)方法(有额外drawcall)
这个问题可能与Unity的资源加载机制有关。Unity使用资源缓存来提高加载速度,这可能导致重复加载资源。另外,iOS平台上的资源管理也有一些限制,可能会导致资源在加载和释放时出现问题。
下面是一些可能导致重复加载的原因:
1 资源未正确释放:Unity在iOS平台上采用了一些特殊的资源加载和释放机制,如果资源未正确释放,可能会导致重复加载。
2 资源被多个场景引用:如果多个场景引用了同一资源,Unity可能会重复加载该资源。
3 资源缓存:Unity使用资源缓存来提高加载速度,这可能导致重复加载资源。
为了解决这个问题,可以尝试以下几种方法:
1 确保资源正确释放:在场景切换或游戏退出时,确保所有资源都被正确释放。
2 减少资源重复引用:避免在多个场景中重复引用同一资源,或者使用资源打包工具将资源打包成单独的AssetBundle。
3 关闭资源缓存:使用Unity的ResourcesUnloadUnusedAssets()方法手动释放资源,或者在PlayerSettings中将资源缓存设置为“禁用”。
希望这些信息能够帮助你解决问题。
以上就是关于Unity 编辑器 *** 作全部的内容,包括:Unity 编辑器 *** 作、Kinect结合Unity基础使用(一)、Unity对项目性能优化的实现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)