Unity场景优化

合集下载

unity 问题及解决方案

unity 问题及解决方案

unity 问题及解决方案
《Unity问题及解决方案》
Unity是一款广泛使用的跨平台游戏开发引擎,但在使用过程中,有时会遇到一些问题。

以下是一些常见的Unity问题及其解决方案。

问题1:Unity运行速度缓慢
解决方案:将Unity版本更新到最新版本,通过使用性能优化技术来提高游戏的运行速度,比如合并小的网格和使用低多边形网格。

尽量减少屏幕上的物体数量,优化脚本代码等等。

问题2:游戏在特定设备上无法运行
解决方案:检查游戏的最低系统要求,并确保目标设备满足这些要求。

对游戏进行适配,使用跨平台插件能够使游戏在不同平台上运行。

问题3:Unity编辑器闪退或崩溃
解决方案:检查电脑硬件和系统的兼容性,可能需要升级显卡驱动程序或操作系统版本。

同时注意Unity编辑器所需的系统资源,确保电脑足够内存和存储空间,或考虑关闭其他消耗系统资源的程序。

问题4:UI界面不兼容不同设备
解决方案:根据目标设备的分辨率和屏幕尺寸制作不同版本的UI素材,或者使用自适应UI系统来适配不同尺寸的屏幕。

问题5:游戏在特定场景中出现闪烁或卡顿
解决方案:检查场景中的资源是否过多,尝试减少或优化资源。

可能需要使用异步加载技术来加载资源,也可以对游戏进行更细致的性能优化。

总之,Unity作为一款优秀的游戏引擎,为开发者提供了丰富
的工具和技术,但在使用过程中难免会遇到一些问题。

关键在于仔细分析问题的原因,灵活运用解决方案,才能够更好地解决Unity的问题并提高游戏开发效率。

Unity3D游戏GC优化总结---protobuf-net无GC版本优化实践

Unity3D游戏GC优化总结---protobuf-net无GC版本优化实践

Unity3D游戏GC优化总结---protobuf-net⽆GC版本优化实践⼀ protobuf-net优化效果图 protobuf-net是Unity3D游戏开发中被⼴泛使⽤的Google Protocol Buffer库的c#版本,之所以c#版本被⼴泛使⽤,是因为c++版本的源代码不⽀持Unity3D游戏在各个平台上的动态库构建。

它是⼀个⽹络传输层协议,对应的lua版本有两个可⽤的库:⼀个是proto-gen-lua,由tolua作者开发,另外⼀个是protoc,由云风开发。

protobuf-net在GC上有很⼤的问题,在⼀个⾼频率⽹络通讯的状态同步游戏中使⽤发现GC过⾼,所以对它进⾏了⼀次⽐较彻底的GC优化。

下⾯是优化前后的对⽐图:protobuf-net优化前GC和性能效果图protobuf-net优化后GC和性能效果图⼆ Unity3D游戏GC优化概述 有关Unity3D垃圾回收的基本概念和优化策略Unity官⽹有发布过⽂章:。

这篇⽂章讲述了Unity3D垃圾回收机制,和⼀些简单的优化策略,讨论的不是特别深⼊,但是⼴度基本上算是够了。

我罗列⼀下这篇⽂章的⼀些要点,如果你对其中的⼀些点不太熟悉,建议仔细阅读下这篇⽂章: 1、C#变量分为两种类型:值类型和引⽤类型,值类型分配在栈区,引⽤类型分配在堆区,GC关注引⽤类型 2、GC卡顿原因:堆内存垃圾回收,向系统申请新的堆内存 3、GC触发条件:堆内存分配⽽当内存不⾜时、按频率⾃动触发、⼿动强⾏触发(⼀般⽤在场景切换) 4、GC负⾯效果:内存碎⽚(导致内存变⼤,GC触发更加频繁)、游戏顿卡 5、GC优化⽅向:减少GC次数、降低单次GC运⾏时间、场景切换时主动GC 6、GC优化策略:减少对内存分配次数和引⽤次数、降低堆内存分配和回收频率 7、善⽤缓存:对有堆内存分配的函数,缓存其调⽤结果,不要反复去调⽤ 8、清除列表:⽽不要每次都去new⼀个新的列表 9、⽤对象池:必⽤ 10、慎⽤串拼接:缓存、Text组件拆分、使⽤StringBuild、Debug.Log接⼝封装(打Conditional标签) 11、警惕Unity函数调⽤:、GameObject.tag、FindObjectsOfType<T>()等众多函数都有堆内存分配,实测为准 12、避免装箱:慎⽤object形参、多⽤泛型版本(如List<T>)等,这⾥的细节问题很多,实测为准 13、警惕协程:StartCoroutine有GC、yield return带返回值有GC、yield return new xxx有GC(最好⾃⼰做⼀套协程管理) 14、foreach:unity5.5之前版本有GC,使⽤for循环或者获取迭代器 15、减少引⽤:建⽴管理类统⼀管理,使⽤ID作为访问token 16、慎⽤LINQ:这东西最好不⽤,GC很⾼ 17、结构体数组:如果结构体中含有引⽤类型变量,对结构体数组进⾏拆分,避免GC时遍历所有结构体成员 18、在游戏空闲(如场景切换时)强制执⾏GC三 protobuf-net GC分析3.1 protobuf-net序列化 先分析下序列化GC,deep profile如下: 打开PropertyDecorator.cs脚本,找到Write函数如下:1public override void Write(object value, ProtoWriter dest)2 {3 Helpers.DebugAssert(value != null);4 value = property.GetValue(value, null);5if(value != null) Tail.Write(value, dest);6 }View Code 可以看到这⾥MonoProperty.GetValue产⽣GC的原因是因为反射的使⽤;⽽ListDecorator.Write对应于代码Tail.Write,继续往下看: 找到对应源代码:1public override void Write(object value, ProtoWriter dest)2 {3 SubItemToken token;4bool writePacked = WritePacked;5if (writePacked)6 {7 ProtoWriter.WriteFieldHeader(fieldNumber, WireType.String, dest);8 token = ProtoWriter.StartSubItem(value, dest);9 ProtoWriter.SetPackedField(fieldNumber, dest);10 }11else12 {13 token = new SubItemToken(); // default14 }15bool checkForNull = !SupportNull;16foreach (object subItem in (IEnumerable)value)17 {18if (checkForNull && subItem == null) { throw new NullReferenceException(); }19 Tail.Write(subItem, dest);20 }21if (writePacked)22 {23 ProtoWriter.EndSubItem(token, dest);24 }25 }View Code 可以看到这⾥的GC是由list遍历的foreach引起的。

Unity场景遮挡剔除技术优化

Unity场景遮挡剔除技术优化

Unity场景遮挡剔除技术优化复杂的三维场景,尤其是复杂的地表模型,具有复杂的结构,在渲染时需要花费更多的时间。

若要在实时渲染过程中快速绘制地形,应该首先考虑如何解决大规模数据构成的复杂地形表面模型与计算机图形硬件有限的绘制能力之间的矛盾。

遮挡剔除技术的出现,很大程度上解决了这一矛盾。

遮挡剔除(Occlusion Culling)技术,是用于三维场景优化的重要技术,当物体被其它更靠近摄像机的物体完全遮挡而无法在摄像机中显示时,将不对该物体进行渲染。

虚拟漫游系统的视点离地表较近,三维场景中较远的物体易被较近的物体所遮挡,当应用遮挡剔除技术时,将大幅降低场景中需要渲染的模型的数量,从而增加了产品实时渲染的速度。

Unity中的遮挡剔除技术遮挡剔除在技术实现上,主要有两类方法:一是将三维遮挡物体投影生成二维遮挡面并保存到深度缓存中,再利用深度图确立的遮挡关系进行深度剔除操作,即深度剔除法另一类是将三维遮挡物体映射到二维平面,然后直接叠加到生成图像上,从而解决遮挡问题,即图像叠加方法。

在Unity中使用遮挡剔除时,会在渲染对象被送进渲染管线之前,将因为遮挡而不会被看到的隐藏对象或隐藏面进行剔除,从而减少了每帧的渲染数据量,提高了渲染性能。

Unity在减少渲染对象时,先通过摄像机的视场角范围和剪切平面将不显示的内容进行剔除,然后可以对显示视角范围内的保留物体进行遮挡剔除。

Unity中遮挡剔除技术的应用(一)Occlusion Culling的应用打开Unity,在场景中导入或者创建三维场景,这里重点研究遮挡剔除问题,所以使用Unity 建立一个如下图所示的简易示例场景。

场景中立方体表示实际场景中的建筑,它们之间会根据场景摄像机拍摄位置和视角的变化出现遮挡的情况。

Occlusion Culling的应用就是将被遮挡住的物体从渲染队列中剔除,以减少硬件设备的数据计算量。

(二)设置Occlusion面板在Unity菜单中选择Windows—Occlusion Culling命令,将打开Occlusion窗口,场景中将出现Occlusion Culling设置面板,选择该面板中的View Volumes选项,场景中的物体将被网格进行空间划分,如下图所示。

Unity游戏优化与性能测试

Unity游戏优化与性能测试

Unity游戏优化与性能测试在游戏开发过程中,优化和性能测试是非常重要的环节,它们可以极大地提升游戏的质量和用户体验。

Unity作为一款流行的游戏引擎,也提供了一系列的优化工具和性能测试功能,帮助开发者优化游戏性能。

本文将介绍Unity游戏优化的基本概念、常见的优化技术和Unity的性能测试工具。

第一章:游戏优化的基本概念游戏优化是指在游戏开发过程中,通过改进代码、资源的加载和使用等方法,提升游戏的性能,使其更加流畅、稳定。

在进行游戏优化之前,我们首先需要了解一些基本概念。

1.1 帧率和性能帧率是指每秒钟显示的画面数量,通常以“fps”(帧每秒)为单位表示。

高帧率可以使游戏画面更加流畅,但也需要更高的性能支持。

游戏性能则是指游戏在某个特定设备上的表现,包括帧率、内存占用、CPU占用等指标。

1.2 瓶颈和优化目标在游戏优化过程中,我们往往会遇到一些瓶颈,即限制游戏性能提升的因素。

常见的瓶颈包括CPU、GPU、内存、网络等。

优化目标则是通过针对不同瓶颈采取相应的优化策略,提升游戏性能。

第二章:常见的游戏优化技术2.1 资源的压缩与合并资源的压缩可以减小游戏安装包的体积,加快加载速度。

Unity 提供了多种资源压缩格式,可以根据不同平台和设备选择合适的格式。

资源的合并可以减少批次绘制的次数,优化GPU性能。

2.2 代码的优化代码优化是游戏优化的重要一环,它包括但不限于以下几个方面:避免使用过多的循环和条件判断、合理使用对象池、避免频繁的内存分配和释放等。

此外,Unity还提供了Profiler工具,可以帮助开发者找到代码中的性能瓶颈,进行有针对性的优化。

2.3 光照和阴影的优化光照和阴影是游戏画面中常见的效果,但也是消耗性能的主要因素。

在使用光照和阴影时,可以考虑使用动态光照和实时阴影,避免使用过多的静态光照和预计算阴影。

此外,可以合理设置光照的分辨率和影子的精度,以平衡画面效果和性能。

第三章:Unity的性能测试工具3.1 ProfilerProfiler是Unity内置的性能测试工具,可以帮助开发者分析整个游戏的性能情况。

【Unity优化】DrawCall与Batch

【Unity优化】DrawCall与Batch

【Unity优化】DrawCall与Batch⼀、渲染⼀帧步骤0-1、剔除:摄像机视锥体剔除、代码删除/隐藏Mesh0-2、从硬盘HDD中加载纹理、Mesh到内存RAM,再将需要渲染的加载到VRAM[1]。

1、设置全局 Render State(Unity中对应SetpassCall),包含:顶点/⽚元着⾊器、纹理、材质、光照、透明度等2、CPU发送⼀个DrawCall给GPU,指向VRAM中的⼀个Mesh(不包括材质,这是上⼀步的⼯作)。

3、GPU根据当前 Render State,以及CPU指向的顶点数据,通过代码⽣成像素并显⽰到屏幕。

如果后续Mesh使⽤相同的 Render State,那么重复2、3步骤;否则需要执⾏⼀次1步骤。

步骤3称为管线Pipeline。

管线中从开始到结束,⽐较关键的模块有:顶点着⾊器、光栅化、⽚元着⾊器。

顶点和⽚元着⾊器是可编程的,即常说的Shader。

[1] RAM、VRAM分别存储什么:(1)VRAM:GPU内存仅存储当前帧(DC)需要的资源,⽐如:纹理、mesh、shader、framebuffer、constant buffer、以及其他渲染场景所需的通⽤数据。

处理完当前的DC后,就会清除数据,准备下次DC。

(2)RAM:RAM包含可执⾏代码、⾳频、游戏数据。

⼀般不包含纹理、mesh这些已经在VRAM中的资源(CPU从HDD中读到RAM,传给VRAM,然后从RAM中清除。

然⽽如果需要在CPU中检测碰撞,mesh信息就需要保留)。

(3)RAM、VRAM:动画、物体变换⼀般同时存在。

通常在CPU中每帧更新,然后复制到VRAM中渲染。

⼆、优化概述Render State、DrawCall属于CPU的⼯作,都⽐较耗时。

优化⽅向:降低它们的执⾏次数。

减少 Render State:减少材质的种类减少 DrawCall:不同的Mesh尽量使⽤同⼀个材质;对同种材质的Mesh做合批处理;使⽤GPU Instancing其他优化:避免OverDraw(避免使⽤透明,错误⽰范:为了实现四⾓阴影,使⽤⼀张全屏图⽚)三、优化细节合批分为动态、静态。

基于Unity3D的虚拟现实场景交互设计与优化

基于Unity3D的虚拟现实场景交互设计与优化

基于Unity3D的虚拟现实场景交互设计与优化虚拟现实(Virtual Reality,简称VR)作为一种新兴的技术,正在逐渐改变人们的生活方式和工作方式。

在虚拟现实技术中,Unity3D作为一款强大的跨平台游戏开发引擎,被广泛应用于虚拟现实场景的开发。

本文将重点探讨基于Unity3D的虚拟现实场景交互设计与优化。

1. 虚拟现实场景交互设计在虚拟现实场景中,用户与虚拟环境进行交互是至关重要的。

良好的交互设计可以提升用户体验,增强沉浸感。

在Unity3D中,通过编写脚本和使用内置组件,可以实现丰富多样的交互设计。

1.1 用户输入用户输入是虚拟现实场景中最基本的交互方式之一。

Unity3D支持多种输入设备,如手柄、头盔追踪器、手势识别等。

设计师需要根据不同设备的特点,合理设置用户输入方式,以便用户可以自然而然地与虚拟环境进行互动。

1.2 物体交互在虚拟现实场景中,物体之间的交互也是非常重要的一部分。

通过添加碰撞器和物理材质,可以实现物体之间的碰撞、抓取、移动等操作。

设计师需要考虑物体之间的交互逻辑,使得用户可以按照自己的意愿进行操作。

1.3 界面设计界面设计是虚拟现实场景中不可或缺的一环。

在Unity3D中,可以通过Canvas和UI元素来创建各种界面。

设计师需要注意界面的布局、颜色、字体等细节,以确保用户可以清晰地看到并操作界面上的元素。

2. 虚拟现实场景优化除了交互设计外,优化也是虚拟现实场景开发中必不可少的一环。

优化可以提升程序性能,减少延迟,增加流畅度,从而提升用户体验。

2.1 渲染优化在虚拟现实场景中,渲染是一个非常消耗性能的环节。

为了提高帧率和减少延迟,设计师可以采取一些优化措施,如减少三角形数量、合并网格、使用LOD(Level of Detail)等技术。

2.2 物理优化物理引擎是虚拟现实场景中常用的组件之一。

为了提高物理仿真效果和减少计算量,设计师可以对物理引擎进行优化,如调整碰撞检测精度、限制物理计算范围等。

unity优化 场景绘制cpu占用过高原因分析

unity优化场景绘制cpu占用过高原因分析
unity游戏开发者们在提高游戏的流畅度过程中,经常会遇到因CPU占用过高而导致游戏帧率降低的情况,因此优化CPU占有率是unity游戏开发者们所亟待解决的问题之一。

想要对unity游戏中cpu占用率进行优化,首先需要对CPU占用率过高的原因进行分析。

经常有层次较高的游戏开发者会遗漏一些CPU优化的技巧,使游戏看上去流畅,但是在某些情况下可能会出现帧数明显降低的情况,这通常是由代码不良的设计所致,代码不良的设计会导致性能的大幅降低和cpu的大量占用。

虽然大多数情况下,GameObjects上面的更新函数都只会执行一次,如果某个GameObjects 拥有大量的Update函数,就可能导致CPU占用过高。

另外,生成额外的GameObjects也有可能导致CPU占用过高,一般情况下游戏中应该只会存在必要的GameObjects,无用的GameObjects要求及时删除,以免对游戏的性能产生不利影响以及大量的cpu占用。

此外,像动画,轮子等部件的运算也可能导致CPU占用率过高,如果简单地加载该部件的数据,不实时去检查部件的变化和位置的变化,也会导致大量的cpu占用。

一般而言,要想解决unity中因CPU占用率过高而降低游戏帧率的问题,首先对高占用率的原因进行分析,由此可以指出需要优化的技术点,然后精细地分析解决问题。

有效地优化CPU占用率,可以大大提高游戏的性能,使游戏玩家拥有更加流畅的体验。

基于Unity3D的虚拟现实仿真系统构建与优化

基于Unity3D的虚拟现实仿真系统构建与优化虚拟现实(Virtual Reality,简称VR)技术是一种通过计算机技术模拟出的三维虚拟环境,使用户可以沉浸在其中并与之进行交互。

随着科技的不断发展,VR技术在各个领域得到了广泛的应用,如教育、医疗、娱乐等。

而Unity3D作为一款跨平台的游戏开发引擎,也被广泛应用于虚拟现实仿真系统的构建与优化中。

1. 虚拟现实仿真系统概述虚拟现实仿真系统是利用虚拟现实技术对真实世界进行模拟和再现,使用户可以在虚拟环境中进行体验和互动。

这种系统通常包括硬件设备(如头戴式显示器、手柄等)和软件平台(如Unity3D引擎),通过二者的结合实现对虚拟环境的构建和控制。

2. Unity3D在虚拟现实仿真系统中的应用Unity3D作为一款强大的跨平台游戏引擎,具有良好的图形渲染能力和物理引擎支持,非常适合用于构建虚拟现实仿真系统。

在Unity3D中,开发者可以通过编写脚本、导入模型和材质等方式,快速构建出逼真的虚拟环境,并实现用户与环境的交互。

3. 虚拟现实仿真系统构建流程3.1 确定需求在构建虚拟现实仿真系统之前,首先需要明确系统的需求和目标。

这包括确定要模拟的场景、用户的交互方式、系统的性能要求等。

3.2 环境建模利用Unity3D中的建模工具和资源库,开发者可以快速构建出虚拟环境所需的场景、物体和角色模型。

在建模过程中,需要注意保持模型的逼真度和性能优化。

3.3 添加交互功能通过编写脚本,在Unity3D中添加用户交互功能,如手柄控制、碰撞检测、物体抓取等。

这些功能可以增强用户在虚拟环境中的沉浸感和参与度。

3.4 调试与优化在构建完成后,需要对虚拟现实仿真系统进行调试和优化。

这包括检查场景是否流畅、性能是否稳定、用户体验是否良好等方面。

4. Unity3D在虚拟现实仿真系统中的优化策略4.1 图形优化通过减少多边形数量、合并网格、使用LOD(Level of Detail)技术等方式,优化场景中的模型和纹理,提高图形渲染效率。

ue4大型场景优化思路

ue4大型场景优化思路大型场景在游戏开发中扮演着重要的角色,它们可以为玩家提供广阔的探索空间和视觉享受。

然而,由于场景的复杂性和细节丰富度,优化成为了一个关键的问题。

本文将探讨UE4大型场景的优化思路,以确保游戏在流畅性和性能方面达到最佳状态。

我们要注意场景中的物体数量和多边形数量。

过多的物体和多边形会导致渲染负担过重,从而影响游戏的性能。

因此,我们可以采取一些优化措施,如合并相似物体、使用LOD技术和减少细节等。

通过合并相似物体,可以减少物体的数量,从而降低渲染负荷。

使用LOD技术可以根据物体在屏幕上的大小自动切换不同的细节模型,从而减少多边形数量。

此外,减少细节可以通过删除不必要的细节或使用贴图等方法来实现。

光照也是大型场景中需要考虑的一个重要因素。

过多的光源会导致渲染负担过重,因此我们可以选择合适的光照类型和设置。

在大型场景中,使用动态光源可能会导致性能问题,因此我们可以使用静态光照来减少光源的数量。

此外,还可以使用间接光照和全局光照技术来提高渲染效果,同时减少光源的使用。

大型场景中的地形也需要进行优化。

地形的复杂性和细节丰富度会影响游戏的性能。

因此,我们可以使用地形细节纹理和法线贴图等技术来减少地形的多边形数量,并通过LOD技术来切换不同的地形细节模型。

大型场景中的碰撞体积也需要进行优化。

过多的碰撞体积会影响游戏的物理模拟和碰撞检测性能。

因此,我们可以使用简化的碰撞体积来代替复杂的几何体,从而减少碰撞体积的数量和复杂度。

此外,还可以使用碰撞体积的层次结构来提高碰撞检测的效率。

优化大型场景是游戏开发中不可忽视的重要方面。

通过合并物体、使用LOD技术、减少细节、合理设置光照、优化地形和碰撞体积等措施,可以提高游戏的流畅性和性能。

希望本文的内容对于UE4大型场景的优化有所帮助。

Unity3D性能优化之美术资源制件规范

Unity3D性能优化之美术资源制件规范⼀、场景模型制作规范:1. 同屏地表⾯数限制在3万⾯以内,要充分考虑锁定视⾓的因素,看不到的模型背⾯可以尽量简单化,离可⾏⾛区域远的建筑模型,都可以做成低模,因为是不会⾛近看的。

2. 同屏地表drawcall限制50-70个(包含动态建筑),动态建筑可在地表制作测试完摆放效果正确后再单独输出,提交时不能出现在场景地表⾥⾯。

3. 资源合并规则:区域贴图合并、区域⽹格合并、相同材质合并4. 尽量勿⽤unity⾃带的草对象,应该⽤刷地表的草纹理5. 场景⼤建筑和特效资源独⽴,不⽤放地表,由技术动态控制6. 过⼤的地表,例如超过150⽶(15000像素),可以通过切割地表⽅式输出,程序动态加载7. 刷怪的区域以及玩家战⽃的区域尽量是平缓的,否则打怪放技能时效果不好控制,并且不宜放⼩建筑和动态建筑,影响性能。

8. 场景模型和地表尽量少⽤透明贴图,同个场景的透明贴图尽量在⼀张纹理9. 不开启实时灯光,全部效果⽤后期烘焙的⽅式实现10. 每个场景需制作⾏⾛区域⾯⽚,除地表范围外,⾼度也必须和地⾯⼀致,最后加mesh碰撞体11. 纹理尺⼨优先⽤256或512,最⼤1024,以1024的计算,⼀个场景纹理个数正常控制在两张以内⼆、⾓⾊模型制作规范注意问题:1. ⾻骼数量过量导致的影响:每根⾻骼都是⼀个独⽴的整体,当⽗⾻骼运动时,会带动⼦⾻骼运动,这个运动过程都是需要实时去计算的,⽽游戏内场景⽣物基本都处于运动状态下,导致⾻骼的计算⼀直在持续进⾏,⾻骼越多导致由计算引起的性能消耗更⼤。

2. 模型⾯数过量导致的影响:每个模型的⾯都是独⽴的⼀个三⾓形,⽽每个三⾓形及其贴图区域都是需要渲染的,⾯数越多导致渲染的消耗越⼤。

设置和明确数值:1. 主⾓1500⾯以下,⼩怪500-800⾯。

2. 主⾓⾻骼控制在40根以下,⼩怪尽量20根左右。

3. 贴图控制在1024以下,也可以是512和256,看具体情况选择。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Unity場景優化首先介紹下draw call(這個東西越少你的遊戲跑的越快):在遊戲中每一個被展示的獨立的部分都被放在了一個特別的包中,我們稱之為“描繪指令”(draw call),然後這個包傳遞到3D部分在螢幕上呈現出來。

這就和你希望你的親友收到準備好的聖誕禮物需要包裝好然後穿過城市準時放在他應該出現的地方一樣沒什麼不同。

你的CPU來完成包裝和傳遞他們的活,同時會消耗很多的頻寬,所以最終分配好這些關鍵性資源很重要。

目前,真正可怕的事情是從描繪指令消耗遠景開始,每一個獨立的飛濺到地板上的血跡和一個角色或者一具死屍消耗的位元組是一樣的多的:他們都消耗同樣的描繪指令。

除此之外,沒有什麼更多的差別。

那麼如何降低draw call 呢??那麼我們就用到Culling(剔除)技術。

如果不應用這個技術,電腦是不管3721把場景裡所有的東西都送去渲染的。

看得見的也渲染,看不見得照樣也送去渲染。

很傻是吧,那咋辦呢。

得告訴電腦,那個你看得見的渲染,看不見的就算了。

於是就有了1.視錐體剔除(Frustum Culling)這個unity系統自帶了好像,就不用操心了。

2.遮擋剔除(Occlusion Culling)Unity 3專業版內置了一個強大的Occlusion Culling 外掛程式Umbra免費的遮擋剔除(Occlusion Culling)遮擋剔除是一種什麼樣的特性呢,當一個物體被其他物體遮擋住而不在攝像機的可視範圍內時不對其進行渲染。

. 遮擋剔除在3D圖形計算中並不是自動進行的。

因為在絕大多數情況下離camera 最遠的物體首先被渲染,靠近攝像機的物體後渲染並覆蓋先前渲染的物體(這被稱為重複渲染,無效渲染"overdraw"). 遮擋剔除不同於視錐體剔除. 視錐體剔除只是不渲染攝像機視角範圍外的物體而對於被其他物體遮擋但依然在視角範圍內的物體則不包括在內. 注意當你使用遮擋剔除時你依然受益於視錐體剔除(Frustum Culling).左邊的場景使用了遮擋剔除. 右邊的場景未使用遮擋剔除.遮擋剔除的運行將通過在場景中使用一個虛擬的攝像機來創建一個物體潛在可視性狀態(set)的層級. 這些資料可以讓每個執行時間內的攝像機來確定什麼能看見什麼看不見。

通過這些資料, Unity 將確定只把可以看見的物體送去渲染. 這將降低draw calls 的數量並提供遊戲的運行效率.occlusion culling的資料由單元(cells)組成. 每個單元是整個場景範圍數值的一部分. 更多特定的單元來自一個二叉樹(binary tree). Occlusion Culling使用兩個叉, 一個給V iew Cells (靜態物體) 另一個給Target Cells (移動物體). V iew Cells map給出了一個定義了靜態可視物體的索引清單(精確剔除後的靜態物體).非常重要的一點是在創建你的物體時要隨時注意,因為你需要在物體的尺寸和單元的尺寸間取得一個好的平衡. 理想情況下, you shouldn't have cells that are too small in comparison with your objects but equally you shouldn't have objects that cover many cells.有時你可以通過將大的物體拆成幾個部分來改進遮擋剔除效果. 無論如何你仍然能夠將小的物體合併為一體來降低draw calls, 在它們都屬於一些小的組件的時候, occlusion culling 將不起作用.確定元件中那個是可視的元件的選集和可視資訊被認為是PVS (潛在可視狀態Potentially Visible Set). Occlusion Culling設置為了使用遮擋剔除需要進行相關的手動設置.首先你關卡中的幾何體必須被分割成明顯的不同尺寸的塊. 這也有助於佈置關卡中小塊的容易定義的區域被其他大物體遮擋(例如牆,建築物)這意味著每個單獨的mesh被確定是否渲染取決於occlusion 資料. 所以如果你有一個物體包含了房間裡的所有傢俱那麼所有的傢俱要麼全渲染,要麼全不渲染. 是否渲染是基於元件而不是基於每個單獨物體自身的。

在檢視面板(Inspector)你需要標識(tag)所有需要應用遮擋剔除的場景物體。

最快的方法是是將你需要標示為Static的物體作為一個Empty GameObject 的子物體並設置這個Empty GameObject 為Static,當option出現的時候選擇affect children. 當子物體被tagged as Static你可以取消子物體和Empty GameObject的父子關係.檢視面板中的Static checkbox下一步點擊Tools->Occlusion Culling. 打開Occlusion Culling 檢視面板,在面板中你會發現幾個數值被調整過了。

這些數值前面描述過:-Occlusion Culling - Object遮擋剔除檢視面板的object標籤.Object標籤可以讓你創建Occlusion Areas GameObjects. 這些區域讓你指定什麼地方你會使用遮擋剔除.注意: 預設情況下如果你不創建任何遮擋剔除區域, 整個場景都會進行遮擋剔除. PropertiesQuick Select快速選擇和創建一個Occlusion Area並且快速編輯它.None這個是預設值.Create New創建一個新的Occlusion Area GameObject.當你點擊Create New in the Quick Select drop down, Unity將自動創建一個Occlusion Area 並且刪除預設區域(整個場景). 現在你可以根據需要開始調整Occlusion Area(s).Occlusion Area 檢視面板.PropertiesSize定義Occlusion Area的尺寸.Center選擇Occlusion Area的中心. B默認為0,0,0 並在box的中心位置.Is View V olume定義攝像機的活動範圍區域. 點選這個選項才能應用遮擋剔除在Occlusion Area內的靜態物體.Is Target V olume如果你要遮擋剔除運動物體,打開這個選項.Target Resolution確定區域內的Occlusion Culling精度. 即一個Occlusion Area的單元尺寸. 注意: 這個選項只對Target Areas(移動物體)起作用.Low減少計算時間但同時精度降低.Medium計算時間和精度中等,比較平均.High計算時間長但精度高.V ery High精度很高,計算時間更長.Extremely High最高精度.注意: 計算時間令人髮指。

如果攝像機處於遮擋區域之外或者任何物體超出區域, 這些物體將不會被遮擋剔除. Occlusion Culling - BakeOcclusion culling 檢視面板bake tab.PropertiesView Cell Size每個view area單元的尺寸, 尺寸越小遮擋剔除越精確. 這個數值用來平衡遮擋剔除的精度和存儲容量Near Clip PlaneNear clip plane 如果設置最小數值那麼遊戲中所有攝像機都可看到.Far Clip PlaneFar Clip Plane 用於選擇objects. 任何物體的距離大於這個設定數值都會被自動遮擋.(Should be set to the largest far clip planed that will be used in the game of all the cameras)Quality品質級別Preview開發階段使用這個(ie,不是很準確但可以讓你御覽在遊戲中的大致表現)Production如果開發基本結束準備發佈那就該選擇這個(會耗費更多的時間但更精確)當你調整完這些數值後可以點擊Bake按鈕開始處理Occlusion Culling 資料. 如果你對結果不太滿意,你可以點擊Clear 按鈕刪除以前的計算資料.Occlusion Culling - VisualizationOcclusion culling 檢視面板visualization 可視標籤PropertiesQuick Select讓你快速選擇場景中的任何攝像機來觀看遮擋剔除的效果The near and far planes 定義了一個虛擬攝像機來計算遮擋剔除資料. 如果你有幾個攝像機near 或far planes不同, 你應該設置near plane 和largest far plane distance適配所有攝像機來調整物體的包括範圍.所有場景裡的物體只在數值範圍內起作用所有請確定你的所有物體都處於可視範圍.當你準備好生成occlusion data, 點擊Bake 按鈕. 記住在Bake標籤的Quality selection box 中事先選擇Preview 和Production. Preview可以快速生成資料並可以快速檢查結果. Production 用於產品發佈前的生成和檢測.請記住遮擋剔除的資料計算生成速度取決於事先設置的cell levels(單元級別), 資料尺寸大小和精度. Unity會在視窗底部顯示PVS 運算狀態.運算處理結束後, 你會在V iew Area看到一些不同顏色的cube. 顏色相同的區域共用遮擋剔除資料.點擊Clear 如果你想刪除所有遮擋剔除的事先計算好的資料(預計算數據).Moving Objects如果想應用遮擋剔除到一個運動物體你必須創建一個Occlusion Area然後設定其尺寸來適配運動物體的活動空間(注意:運動物體不能被標示為static).創建Occlusion Area後, 檢查Is Target V olume checkbox 來遮擋剔除運動物體.移動物體的Occlusion Area propertiesSize設定Occlusion Area 尺寸.Center設定Occlusion Area的中心. 默認0,0,0 並位於box的中心.Is View V olume定義攝像機能到哪裡. 檢查這個數值來遮擋剔除Occlusion Area中的static objects .Is Target V olume遮擋剔除運動物體時必選Target Resolution確定區域內的遮擋剔除精度。

相关文档
最新文档