当前位置: 首页 > news >正文

网站用excel做数据库东原ARC网站建设公司

网站用excel做数据库,东原ARC网站建设公司,艺术字体在线生成器免费转换器,如何让百度搜到我的网站批量渲染是通过减少CPU向GPU发送渲染命令#xff08;DrawCall#xff09;的次数#xff0c;以及减少GPU切换渲染状态的次数#xff0c;尽量让GPU一次多做一些事情#xff0c;来提升逻辑线和渲染线的整体效率。 Draw Call性能消耗原因是命令从Runtime到Driver的过程中DrawCall的次数以及减少GPU切换渲染状态的次数尽量让GPU一次多做一些事情来提升逻辑线和渲染线的整体效率。 Draw Call性能消耗原因是命令从Runtime到Driver的过程中CPU要发生从用户模式到内核模式的切换。 静态合批 静态合批也叫静态批处理是Unity的一种优化技术。 对于始终静止不动的物体使用静态合批后CPU会把它们合并为一个批次发送给GPU处理这样可以减少Draw Call带来的性能消耗从而提升游戏性能。 要使用静态合批必须确保Edit——Project Settings——Player——Other Settings——Static Batching是勾选的。 把一个物体设置为静态的方法 选中该物体点击在Inspector窗口右上角的Static右方的下拉菜单选择Batching Static。 使用静态合批虽然可以提升游戏性能但是设置为静态的物体在整个游戏中就不能再运动了强行使它们运动会出问题。 而且即使按照以上步骤进行了静态合批也不一定保证会成功必须满足以下全部条件静态合批才会成功 1、游戏对象处于激活状态。2、游戏对象有一个Mesh Filter组件并且该组件已启用。3、Mesh Filter组件具有对网格的引用。4、网格已启用Read/Write功能。5、网格的顶点计数大于0。6、该网格尚未与另一个网格组合。7、游戏对象有一个Mesh Renderer组件并且该组件已启用。8、网格渲染器组件不将任何材质与DisableBatching标记设置为true的着色器一起使用。9、要批处理在一起的网格使用相同的顶点属性。例如Unity可以将使用顶点位置、顶点法线和一个UV的网格与另一个UV进行批处理但不能将使用顶点定位、顶点法线、UV0、UV1和顶点切线的网格进行批处理。 即使静态合批成功合出来的每个批次可以包含的网格顶点数是有限的最多是64000个顶点。如果超过这个数则会创建到另一个批次中。 如果要在游戏运行时进行静态合批则可以使用StaticBatchingUtility类的Combine方法。 StaticBatchingUtility.Combine(GameObject 根物体)         对指定的根物体的所有子孙物体进行静态合批。         只有当它们符合静态合批的所有条件静态合批才会成功。         成功之后这些物体就不能再运动了强行运动会出问题。但是该根物体仍然允许运动。 动态合批 动态合批也叫动态批处理是Unity的一种优化技术。 对移动的物体使用动态合批后则Unity不会一个个绘制它们而是把它们合并为一个批次Batch再由CPU把它们一次性提交给GPU进行处理这样可以减少Draw Call带来的性能消耗从而提高性能。 动态合批默认是由Unity自动完成。可以在Edit——Project Settings——Player——Other Settings——Dynamic Batching查看。默认Dynamic Batching是勾选的当条件满足时Unity会自动对使用了相同材质Material的物体进行动态合批。如果取消勾选则不会进行动态合批。 即使勾选了Dynamic Batching也必须同时满足以下条件动态合批才会成功 1、Unity不能对包含超过900个顶点属性和225个顶点的网格应用动态批处理。这是因为网格的动态批处理对每个顶点都有开销。例如如果你的着色器使用顶点位置、顶点法线和单个UV那么Unity最多可以批处理225个顶点。然而如果你的着色器使用顶点位置、顶点法线、UV0、UV1和顶点切线那么Unity只能批处理180个顶点。2、如果GameObjects使用不同的材质实例Unity就不能将它们批处理在一起即使它们本质上是相同的。唯一的例外是阴影施法者的渲染。3、带有光贴图的游戏对象有额外的渲染参数。这意味着如果你想批处理光照贴图的游戏对象它们必须指向相同的光照贴图位置。4、Unity不能完全将动态批处理应用于使用多通道着色器的GameObjects。 几乎所有的Unity着色器都支持正向渲染中的多个光源。为了实现这一点他们为每个光处理一个额外的渲染通道。Unity只批处理第一个渲染通道。它不能批处理额外的逐像素灯光的绘制调用。 遗留延迟渲染路径不支持动态批处理因为它在两个渲染通道中绘制GameObjects。第一个通道是灯光预通道第二个通道渲染GameObjects。 其中我们要注意的是物体必须使用相同的材质才有可能成功进行动态合批。 使用动态合批往往能减少CPU和GPU的开销提升游戏性能但同时也会占用一定的内存。 是否要开启动态合批要根据自己的项目来定。可以尝试启用在性能分析器中看看效果如果如果效果好再确定启用它。 GPU Instancing 使用GPU Instancing可以在一个Draw Call中同时渲染多个相同或类似的物体从而减少CPU和GPU的开销。 要启用GPU Instancing我们可以选中一个材质然后在Inspector窗口勾选Enable GPU Instancing这样就可以了。 但是即使勾选了Enable GPU Instancing也不一定会成功。 要成功使用GPU Instancing进行优化游戏对象必须同时满足以下条件 1、使用相同的材质和网格。2、材质的着色器必须支持GPU Instancing。例如标准着色器和表面着色器就支持GPU Instancing。3、网格的顶点布局和着色器必须相同。如果网格的顶点布局或着色器不同那么它们就无法被合并成一个实例。4、每个实例需要有不同的变换信息例如位置、旋转、缩放。虽然多个实例可以使用相同的材质和网格但是它们必须拥有不同的变换信息才能被正确地实例化并渲染出来。 另外需要注意的是GPU Instancing与SRP Batcher不兼容。如果项目使用了SRP Batcher并且配置为优先使用SRP Batcher而不是GPU实例化启用GPU实例化可能不会生效。SRP Batcher是Unity提供的一种渲染优化技术它可以将多个网格合并成单个批次进行渲染从而提高性能。在这种情况下GPU实例化将被忽略。 使用GPU Instancing往往能减少CPU和GPU的开销提升游戏性能但同时也会占用一定的内存。 一般来说当场景中有大量重复的网格实例时可以尝试启用GPU Instancing。例如场景中有大量树木、草地、石块等这些实例具有相同的网格和材质只是位置、颜色等属性稍有差异那么启用GPU Instancing或许能够显著提高性能。 遮挡剔除 正常情况下如果一个障碍物A挡住了后面的物体B虽然我们看不见物体B但是Unity仍然会消耗性能来渲染这个物体B。这样CPU和GPU就会有一部分性能白白浪费在渲染物体B身上。 如果想在一个障碍物挡住了后面的物体后不渲染被挡住的物体则可以使用遮挡剔除。 以一堵墙挡住几个小球为例选中这堵墙在Inspector窗口右上角的Static右侧的下拉菜单处选择Occluder Static则这堵墙就是遮挡物。分别选中这些小球在Inspector窗口右上角的Static右侧的下拉菜单处选择Occludee Static则这些小球就是被遮挡物。 注意无论是勾选了Occluder Static还是Occludee Static勾选后物体就无法运动了。 对于一个物体两个标签都可以勾选这样它既可以遮挡剔除别的物体也可以被别的物体遮挡剔除。 有时候被遮挡物只勾Occludee Static烘焙之后可能看不出遮挡剔除的效果建议把Occluder Static也勾上再重新烘焙或许就能看出效果了。 选中摄像机要确保它启用了Occlusion Culling属性。 设置完之后要创建一个遮挡区域当摄像机处于这个遮挡区域中遮挡剔除才会生效。 创建遮挡区域的方法         方法1、打开Occlusion Culling窗口。打开方法Window——Rendering——Occlusion Culling——Bake。打开之后选择Object选项卡点击Occlusion Areas点击Create New右侧的Occlusion Area。         方法2、创建一个空物体在它身上添加Occlusion Area组件。 Occlusion Area组件的Size决定了遮挡剔除区域的范围它越大烘焙之后生成的遮挡剔除区域就越大。Center控制遮挡区域中心点的世界坐标。Is View Volume表示是否定义视图体积只有启用了这个选项Occlusion Area组件才可能生效。 之后要让遮挡剔除生效还要在Occlusion Culling窗口的Bake选项卡中点击右下方的Bake按钮进行烘焙遮挡剔除才可能生效。而且以后每次调整完场景的遮挡物、被遮挡物、Occlusion Area组件的范围都要这样烘焙一次。如果点击旁边的Clear按钮则会清除之前烘焙的数据。 烘焙完之后当摄像机在Occlusion Area组件的范围内则被遮挡的物体不会被渲染。遮挡物实际上遮挡了摄像机视锥体的范围只要物体完全没有出现在摄像机视锥体的范围内则都不会被渲染。但是一旦物体的任意一小部分暴露在了摄像机视锥体的范围内则这个物体整个会被渲染出来         当摄像机移出了Occlusion Area组件的范围则遮挡剔除会失效。 Occlusion Culling窗口         Object选项卡。分别点击All、Renderers、Occlusion Areas按钮可以筛选Hierarchy窗口的内容。之后在Hierarchy窗口或Scene窗口中选择一个筛选出来的游戏对象就可以Occlusion Culling窗口中查看它的遮挡剔除设置。         Bake选项卡。用于烘焙。遮挡剔除必须烘焙之后才可能生效。Set default parameters用于将参数重置为默认值。Smallest Occluder表示用于遮挡其它游戏对象的最小游戏对象的大小以米为单位数值越小遮挡的效果越精确但是性能开销也越大。Smallest Hole表示摄像机可以看到的最小间隙的直径以米为单位需要注意的是设置过小的Smallest Hole值可能会导致一些细微的间隙被错误地认为是可见的从而导致部分遮挡物不被正确地剔除。Backface Threshold的数值越小烘焙所产生的文件所占空间就越小但也可能造成视觉上的失真。Bake按钮用于烘焙。Clear按钮用于清除上一次烘焙的数据。         Visualization选项卡。选择后可以在Scene窗口看到遮挡剔除的效果。此时在Scene窗口可以看到三个选项。         ①Camera Volumes。启用后可以在Scene窗口看到黄色区域当摄像机在这个黄色区域内遮挡剔除才可能会生效摄像机离开这个区域则遮挡剔除就会失效。我们还可以看到灰线这些灰线指示摄像机当前位置所对应的遮挡剔除数据中的单元格以及当前单元格中的细分。Bake选项卡Smallest Hole参数设置定义了单元格内细分的最小大小它的值越小每个单元格产生的细分越多且越小从而使精度提高并且文件增大。         ②Visibility Lines。启用后我们会看到绿色的区域它表示摄像机可以看到的范围。         ③Portals。启用后我们可以看到一些线它们代表遮挡数据中单元格之间的连接。 进行遮挡剔除的烘焙时不会烘焙动态的游戏对象的信息到遮挡剔除的数据中。动态的游戏对象只能作为被遮挡物而不能充当遮挡物。要让动态的游戏对象成为遮挡剔除中的被遮挡物可以选中它启用它身上Mesh Renderer组件身上的Dynamic Occlusion属性。 使用Occlusion Portal组件也可以实现遮挡剔除。         例如可以在一堵墙上添加Occlusion Portal组件。而且这堵墙不要勾选Inspector窗口右上角下拉菜单的Occluder Static和Occludee Static但是被它遮挡的物体仍然要勾选Occluder Static和Occludee Static。         设置好之后打开Occlusion Culling窗口在Bake选项卡进行烘焙。         这样一来Occlusion Portal组件就会生效。当取消勾选它的Open属性后被这堵墙就会使用遮挡剔除。当勾选它的Open属性后被这堵墙就不会使用遮挡剔除。我们可以使用代码来控制Open属性控制这堵墙在什么时候使用遮挡剔除什么时候不使用遮挡剔除。 光照优化 当物体离光源比较远的时候取消光照效果节省性能 或者将实时光照更改为烘焙光照 性能优化思路 可以使用Unity UPR对整个项目进行性能分析找出问题后再手动优化它们。 其中Unity UPR中的Asset Checker能对本地的整个Unity项目进行性能分析帮助我们找出问题。 场景优化         对始终静止不动的游戏对象使用静态合批技术。         尽量使用同一个材质以便使用动态合批技术。         使用GPU Instancing技术。         使用遮挡剔除。         进入游戏后的第一个场景要尽量简单这样可以减少游戏的启动时间。可以先进一个简单的场景再进行异步加载之后再进入游戏的主要的场景。         尽量避免Hierarchy窗口的层级结构过深。例如一个物体有很多个子物体这些子物体又有其它子物体这些子物体又有其它子物体继续这样下去就会导致层级结构过深我们应尽量减少这种情况。         Edit——Project Settings——Quality可以对不同平台中游戏的品质进行设置。         如果使用了后期处理技术例如Post Processing等插件调整屏幕效果的属性不要使用太绚丽的特效可以优化性能。         要优化Terrain地形可以使用Unity资源商店的插件例如Terrain To Mesh插件可以把地形烘焙成网格。         场景要尽可能简单尽量多使用预制体用代码动态创建它们出来并管理它们。 光照优化         减少光源。         调节好每个Light组件的属性平衡视觉效果和游戏性能。         尽量不要用实时光照而是考虑用烘焙光照或者混合光照此时可以配合光照探针使用。Lighting窗口可以设置烘焙光照的参数。         减少启用的阴影投射。         根据摄像机距离光源的距离用脚本来决定是否启用光源和阴影。但是这样就会花费一些性能来计算摄像机到光源的距离。         可以考虑设置光照的阴影。无阴影的性能最好硬阴影的性能稍差软阴影的视觉效果最好但是性能是这三者中最差的。         备注光照和阴影最影响项目的性能其次才是模型网格和贴图。把实时光照改成烘焙光照可以使游戏性能大幅度增加。         注意MeshRenderer组件上的属性默认情况下Unity 会启用阴影投射和接收、光照探针采样、反射探针采样和运动矢量计算。如果项目不需要这些功能中的一个或多个请确保关闭它们。2D游戏尤其要注意往往都不需要它们。         远处的景物如果确定玩家无法到达则可以不用模型而是把远处的景物做成一张贴图放到天空盒的材质中给天空盒使用。也可以使用反射探针烘焙出一张贴图然后放到天空盒的材质。 图片优化         如果这张图片是应用在移动端的则导入Unity前可以对这张图的每条边进行调整确保每条边的长度都是2的正整数次方个像素。例如2、4、8、16...256、512、1024、2048、4096...。这个做法只对移动端有效。         图片导入Unity后可以选中这张图片在Inspector窗口设置它的属性。设置这些属性可以在发布不同的平台分别对该图片进行相应的压缩。可以在合理的范围内减小Max Size对于许多移动端的游戏2048x2048 或 1024x1024 足以满足纹理图集的要求而 512x512 足以满足应用于3D模型的纹理的要求。如果图片不需要读写则可以取消勾选Read/Write Enabled如果勾选可能导致双倍的内存占用。Filter Mode一般选择Bilinear即可平衡性能和视觉效果如果选择Point(no filter)则视觉效果不太行但性能开销也小如果选择Trilinera则视觉效果最好但性能开销最大。Aniso Level一般选择1只有个别比较重要的图片才需要设置为大于等于2的值。         图片导入Unity后会默认生成Mip Maps格式。当摄像机到这幅贴图距离近则显示最原始的图片当摄像机距离这幅贴图的距离远则这幅贴图会变模糊以此降低渲染的性能消耗。但由于之前显示的一幅图现在变成了有多幅所以这样会略微增加内存消耗。如果确定本游戏的摄像机到图片的距离几乎不怎么变化则可以禁用这个功能。点击该贴图在Inspector面板的Advanced中取消勾选Generate Mip Maps这样就不会生成Mip Maps增加游戏性能。如果是2D游戏则可以禁用这个功能。如果是UI贴图也可以禁用这个功能。         图片导入Unity后可以选中这张图片在Inspector窗口设置它在各个平台的Format和Compressor Quality。Format可以参考官方文档https://docs.unity3d.com/2021.3/Documentation/Manual/class-TextureImporterOverride.html         用Sprite Atlas把图片打包成图集。但是这样一来要使用图集中的任意一张图片都会先加载这整个图集这样占用的内存会增加。 UI优化         尽量避免使用IMGUI来做游戏时的UI因为IMGUI的开销比较大。         如果一个UGUI的控件不需要进行射线检测则可以取消勾选Raycast Target         尽量避免使用完全透明的图片和UI控件。因为即使完全透明我们看不见它但它仍然会产生一定的性能开销。如果UI中一定要用到很多张完全透明的图片则建议把这些完全透明的图片由单独的摄像机进行渲染且这些UI不要叠加到场景摄像机的渲染范围内。         尽量避免UI控件的重叠。如果多个UI有重叠的部分则会稍微增加一些额外的计算和渲染的开销。虽然这部分开销通常是非常小的但我们最好也尽量避免这种情况。         UI的文字使用TextMeshPro比使用Text的性能更好。但是TextMeshPro对中文的支持不太好。 模型优化         模型导入Unity后可以选中这个模型在Inspector窗口设置它的属性。 在Model选项卡启用Mesh Compression可以压缩模型压缩程度越高模型精度越低但是模型也会节省一些空间。如果该模型不需要用代码来读写则可以取消勾选Read/Write Enabled。设置Optimize Game Objects可以优化模型。如果该模型不需要使用法线则可以把Normals设置为None。如果该模型不需要用混合变形法线则可以把Blend Shape Normals设置为None。如果该模型不需要使用切线则可以把Tangents设置为None。如果该模型不需要用光照UV贴图则可以取消勾选Swap UVs和Generate Lightmap UVs。 对于Rig选项卡Animation Type如果选择Generic Rig会比Humanoid Rig性能更好但是一般使用Humanoid Rig是为了对人型的角色进行动画重定向所以要根据自己的情况来选择。如果模型不需要使用动画例如一些完全不会动的石头等物体则可以将Animation Type选择为None。Skin Weights默认是4对于一些不重要的动画对象本变量可以设置为1这样可以节省计算量。建议勾选Optimize Bones这样会自动剔除没有蒙皮顶点的骨骼。勾选Optimize Game Object可以提高角色动画的性能但是在某些情况下可能会导致角色动画出现问题是否勾选要看动画效果而定。如果角色模型是可以换装的则在导入该模型后不要勾选这个选项而可以在游戏运行时该角色换装后通过AnimatorUtility.OptimizeTransformHierarchy来勾选这个选项。 对于Animation选项卡如果模型不需要使用动画则可以取消勾选Import Animation。对于Animation选项卡设置Anim.Compression可以调整动画的压缩方式Off表示不压缩动画这样动画文件可能会占用较大的空间但是在运行时不会有任何信息损失Keyframe Reduction表示使用关键帧算法来压缩动画这样会显著减小动画文件的大小同时保持相对较高的动画质量Optimal表示会尽可能高地压缩网格但是这样也会导致压缩时间增加。 对于Materials选项卡如果使用Untiy的默认材质则可以把Material Creation Mode设置为None。         Edit——Project Settings——Player——勾选Optimize Mesh Data这样一来Unity会在构建的时候中对网格数据进行优化处理以达到提高游戏性能的效果。但是这样往往会修改网格我们勾选之后应该要进行测试确保没有问题再确定启用它。         用LOD技术使用Unity自带的LOD Group组件并根据项目的情况来调整该组件的属性。Untiy资源商店也有一些其它的LOD插件。         把多个模型的网格合并为一个网格。可以使用自己写代码使用Unity自带的CombineMeshes方法也可以使用资源商店的插件在资源商店搜Mesh Combine可以搜索到相关的插件例如Easy Mesh Combine Tool等插件。         减少模型的顶点、面、材质、骨骼、蒙皮网格。这一般由美术人员来完成。 动画优化         恰当地设置Animator组件的Culling Mode。Always Animate表示如果该动画不可见也会播放它。Cull Update Transformations表示如果该动画不可见则不会渲染该动画但是依然会根据该动画的播放来改变游戏对象的位置、旋转、缩放这样是常用的选项。Cull Completely表示完全不会播放该动画不但不会渲染该动画而且也不会改变游戏对象的位置、旋转、缩放。         禁用SkinMesh Renderer组件的Update When Offscreen可以让角色在不可见的时候动画不更新这样可以减少计算量提升性能。         对于Animator组件可以使用Animator.StringToHash方法获得指定字符串的哈希值再把它作为参数传入Animator型对象.GetXXX方法和Animator型对象.SetXXX方法中进行使用。就可以避免手滑打错 int hash Animator.StringToHash(Jump); animator.setBool(hash); //使用哈希值 animator.setBool(Jump); //字符串方法 不用的Animation组件和Animator组件可以考虑删掉因为只要它们存在就会消耗性能来检测当前的状态和过渡条件。         一些简单的动画可以使用DoTween、iTween等插件实现而不需要每个动画都用Animator来实现。 音频优化         Unity支持后缀为.wav、.ogg、.mp3的音频文件但建议使用.wav因为Unity对它的支持特别好。注意Unity在构建项目时总是会自动重新压缩音频文件因此无需刻意提前压缩一个音频文件再导入Unity因为这样只会降低该音频文件最终的质量。         把音频文件导入Unity后选中它可以在Inspector窗口设置它的属性。勾选Force To Mono这样就会把这个音频文件设置为单声道。可以节省该资源所占据的空间。因为很少有移动设备实际配备立体声扬声器。在移动平台项目中将导入的音频剪辑强制设置为单声道会使其内存消耗减半。此设置也适用于没有立体声效果的任何音频例如大多数UI声音效果。对于Load Type选项小文件小于200kb选择Decompress on Load中等大小的文件大于等于200kb选择Compressed In Memory比较大的文件如背景音乐选择Streaming。对于Compression Format的选项PCM表示不压缩Vorbis表示压缩但也会尽量保证音频的质量ADPCM表示压缩且压缩的程度比Vobis更高。由于PCM不会压缩音频所以占用的空间大应尽量少用长时间的音频文件可以使用Vorbis短时间的音频文件可以使用ADPCM。Sample Rate Setting用于控制音频文件的采样率对于移动平台采样率不需要太高建议选择Override Sample Rate然后在下方的Sample Rate选择22050Hz一般这样就够用了。 物理优化         使用简单的碰撞器进行碰撞检测如球体碰撞器、盒子碰撞器、胶囊体碰撞器少用网格碰撞器等复杂的碰撞器。即使用多个简单的碰撞器组合在一起也往往比使用网格碰撞器的性能要好。         如果要把多个碰撞器组合成一个碰撞器可以用复合碰撞器。         如果同一个功能既可以用碰撞器来做也可以用触发器来做则往往使用触发器来做性能更好。         尽量减少刚体组件因为刚体组件的物理计算较多。         如果勾选刚体组件的Is Kinematic则性能会有所提高。但这样一来这个刚体只会给别的刚体施加力自己不会受到别的刚体施加的力的作用。         Edit——Project Settings——Player——勾选Optimization下方的Prebake Collision Meshes可以提高碰撞的效率但是构建游戏的时间会增长。         Edit——Project Settings——Physics或者Physics 2D——设置Layer Collision Matrix。它规定了哪些Layer层的游戏对象可以彼此碰撞哪些Layer层的游戏对象会忽略碰撞。如果有些Layer层的游戏对象之前不需要进行碰撞则可以在这里设置取消勾选则表示不会碰撞。         Edit——Project Settings——Time——稍微调大Fixed Timestep这样可以稍微提升游戏性能但是物体的运动可能会出现问题。 代码优化         使用AssetBundle作为资源加载方案。而且经常一起使用的资源可以打在同一个AssetBundle包中。尽量避免同一个资源被打包进多个AB包中。压缩方式尽量使用LZ4少用或不要用LZMA的压缩方式。如果确定后续开发不会升级Unity版本则可以尝试启用打包选项BuildAssetBundleOption.DisableWriteType这样TypeTree信息不会被打到AB包中可以极大减小包体大小以及运行加载时的内存开销。         使用AssetBundle或者Addressables加载的资源如果不使用要记得卸载它们否则会造成内存泄漏。         不用的资源要释放掉不用的引用类型的变量也要赋值为null不要让它们一直占着内存中。         加载资源时尽量使用异步加载。         频繁创建和销毁对象可以使用对象池。         切换场景时旧的场景要释放掉不用的资源也可以考虑释放掉也可以考虑用System.GC.Collect来进行一次垃圾回收。         锁定游戏的帧率 。帧率为30游戏会明显卡顿但是对于手游来说消耗手机的电量比较少。帧率为45游戏有一点点卡但还凑合消耗电量中等。帧率为60游戏很流畅但消耗手机的电量会比较多。可以用Application.targetFrameRate来锁定帧率也可以用UnityEngine.Rendering命名空间中的OnDemandRendering.renderFrameInterval来锁定帧率。         尽量少用foreach语句可以改为for语句。因为每次使用foreach语句会造成微量的内存垃圾。         要判断GameObject型对象.tag是不是某个标签使用GameObject型对象.CompareTag方法会更高效。         尽量少用GameObject.Find方法和Object.FindObjectOfType方法来查找游戏对象可以提前把要查找的游戏对象存储在变量、列表、字典等容器中方便查找。也可以用GameObject.FindGameObjectWithTag方法来查找游戏对象。         在UI显示字符串的时候如果一些内容是固定的我们可以把它拆分开来这样可以减少使用号来拼接的次数减少内存垃圾的产生。例如“杀敌数999”其中“杀敌数”是固定的冒号后面的数字才是会变的那么我们可以用两个Text组件分别记录它们改变的时候只改变冒号后面的数字。         频繁对字符串赋新的值或者频繁拼接字符串的时候可以使用StringBuilder代替string         如果要频繁操作某脚本不要每次都用GetComponent方法来获取这些脚本。可以用一个变量存储起获得的这个脚本之后要访问它就直接访问这个变量即可。也可以考虑在生命周期方法Awake或者Start中声明变量来存储之后访问这个变量即可。         尽量少用正则表达式。虽然正则表达式的形式看上去比较简便但是使用它会造成一定的性能消耗且会产生内存垃圾。         尽量少用LINQ语法因为每次使用LINQ都会产生一定量的内存垃圾。         尽量少用Camera.main来访问主摄像机因为每次访问它实际上Unity都是从场景中查找它的。可以声明一个变量存储它在生命周期方法Awake或Start中获取主摄像机的应用。         在Animator、Shader中使用Get方法和Set方法时不传入字符串作为参数而是传入哈希值。例如Animator组件可以使用Animator.StringToHash方法获得指定字符串的哈希值再把它作为参数传入Animator组件的Get方法或Set方法中进行使用。例如Shader则可以用Shader.PropertyToID方法来获取指定属性的ID         使用非分配物理API。例如使用Physics.RaycastNonAlloc方法代替Physics.RaycastAll方法使用Physics.SphereCastNonAlloc方法代替Physics.SphereCastAll方法以此类推。Physics2D类也有类似的方法。         一般情况下整数的数学运算比浮点数的数学运算效率高浮点数的数学运算比矢量的数学运算效率高。可以灵活运用数学的加法交换律、加法结合律、乘法交换律、乘法结合律在保证结果不变的前提下调整运算顺序减少浮点数的数学运算和矢量的数学运算。         使用高效的算法进行计算         每次执行Debug.Log来打印信息会消耗极少量的性能如果要在游戏正式发布之后不执行某些Debug.Log的语句但又不想把这些代码删掉则可以使用宏来禁止在游戏正式发布之后执行Deubg.Log的语句。例如使用#if语句或者Conditional特性。         尽量减少在生命周期方法Update、FixedUpdate、LateUpdate中的逻辑。其中有些不需要频繁执行的逻辑可以使用协程或者Invoke方法每隔指定的秒数执行一次或每隔指定的帧数执行一次。         尽量避免频繁的装箱拆箱操作。也可以使用泛型这样就能避免装箱拆箱。但是要注意Lua热更新对泛型的支持不太好。         如果物体身上添加了刚体组件则尽量用刚体组件的方法来移动它而不是用Transform类的方法来移动它。         如果物体身上添加了CharacterController组件则尽量用CharacterController组件的方法来移动它而不是用Transform类的方法来移动它。同理如果物体身上添加了刚体组件则应尽量用刚体组件的方法来移动它而不是用Transform类的方法来移动它。         应尽量避免DontDestroyOnLoad中加载的资源过多因为它在切换场景的时候不会被释放声明的变量以及加载的资源会一直占用着内存。我们可以考虑把一些资源不用的资源释放掉需要的时候再加载它。         不使用组件可以删掉这样可以节省一些内存。常见的有AudioSource组件、Animator组件、Animation组件等如果它们不需要使用则可以删掉。         写一个类继承AssetPostProcessor然后定义里面特定的方法以此来自动设置资源导入Unity之后的属性。         尽量避免闭包。因为闭包会产生额外的内存开销。 Shader优化         修改Shader的代码或者自定义一个Shader         修改渲染管线的源码改成符合自己项目的渲染管线或者自定义渲染管线。 Sprite Atlas 优点 减少资源所占的大小打包到同一个Sprte Atlas 图集中的图片会共享相同的纹理数据减少了重复的存储往往起到优化内存的作用可以减少DrawCall提升游戏的渲染性能 缺点 需要手动将图片添加到Sprite Atlas增加了工作量当加载图集中的任意一张图则会先加载整个图集。如果把一些不常用的图打包到一个图集中会浪费内存 LOD LOD是Level of Detail的简称意思是细节层次它是一种优化技术。 LOD的原理就是我们可以为一个游戏对象设定多个模型这些模型消耗的游戏性能由高到低排列。会根据摄像机距离模型的远近自动显示对应的模型。          近的时候显示最精细的模型距离中等的时候显示没那么精细的模型远的时候显示粗糙的模型最远的时候可以隐藏该模型。 使用LOD技术能起到优化渲染性能的效果。但是使用LOD技术也会增加内存占用。 在Unity中可以使用LODGroup组件来实现LOD技术。 LOD级别LOD 0、LOD 1、LOD 2分别表示摄像机从近处看、从中等距离处看、从远处看时所使用的模型的信息。Culled表示不渲染该模型。 把LODGroup组件添加在一个空物体身上。这个空物体身上不添加MeshRenderer组件也不添加MeshFilter组件但可以添加碰撞器。如果要添加刚体、脚本等也可以添加到这个空物体身上的。          这个空物体要渲染的每一个模型都要作为它的子物体它们的身上要添加MeshRenderer组件和MeshFilter组件用于渲染这个模型但是不要给它们添加碰撞器。 Edit——Project Settings——Quality中有控制整个项目LOD的参数。          LOD Bias的值小则摄像机离物体的距离稍微有些变化则不同的LOD级别就会切换。如果LOD Bias的值大则摄像机需要与物体有比较大的距离变化不同的LOD级别才会切换。          Maximum LOD Level表示所有LOD Group组件最大能使用LOD级别超过这个限制的LOD级别的模型不会显示。注意LOD级别0大于LOD级别1LOD级别1大于LOD级别2依次类推。例如把这个值设置为1则即使摄像机到物体的距离达到了LOD级别为0的范围则也不会切换到LOD级别为0的模型来显示。例如把这个值设置为2则即使摄像机到物体的距离达到了LOD级别为0或者LOD级别为1的范围则也不会切换到这些模型来显示。 合并网格 合并网格就是把多个网格合并为一个整体从而提升游戏性能。 但是这样一来我们就不能单独控制这些网格运动了只能控制合并后的整个网格运动。而且合并的网格使用的材质必须是相同的合并才可能成功否则合并之后依然不能提升性能。 可以在Unity资源商店搜Mesh Combine下载相应的插件来实现合并网格的功能例如Easy Mesh Combine Tool等插件。 参考【Unity游戏开发】合批优化汇总 - 知乎 siki学院课程感觉将的有点浅了
http://www.yingshimen.cn/news/22380/

相关文章:

  • 郑州地方网络推广网站对于职业规划做的好的网站
  • 0基础1小时网站建设教程办公空间设计经典案例
  • flash网站片头动画佛山南海区建设局网站
  • 如何做积分商城网站个人网站建设发布信息
  • 福州市高速公路建设指挥部网站qq登录网站怎么做
  • 美橙互联网站备案平台遵义网络科技公司
  • 获取网站访客qq 原理域名举例
  • 深圳做网站的好公司有哪些临城网络营销怎么做
  • wordpress仿QQ看点苏州关键词优化平台
  • 江苏建设个人信息网站网站建设申报书
  • 威海做网站公司哪家好天津在哪做网站
  • 优秀网站专题广州天河区是富人区吗
  • 建网站难不难个人网站一键生成
  • 广安网站建设公司wordpress滑动图片轮播
  • 如何把自己电脑做网站服务器吗1688品牌加盟网
  • 当雄网站建设徐州网架公司
  • 营销网站建设网络公司网站不更新
  • 网站源码在哪拖拽建设网站源码
  • 打开网站代码怎么写销售网站开发的背景
  • 企业网站建设的基本流程wordpress搬家_后台错乱
  • 网站建设的经济可行性行业网址大全
  • 建立网站需要什么条件配资网站开发
  • 网站建设更新网站建设 职责
  • 用flash做的ppt模板下载网站微信小程序一起生活怎么注册
  • 网站建设php实验报告西安好玩的地方有哪些
  • 新建的网站多长时间在百度搜到wordpress支持什么语言包
  • 网站的运营网站建设合同细节
  • 网站跟域名备案数量广西壮族自治区绕口令
  • 做设计去那些网站找素材建立网站的模板
  • 响应式建网站seo搜索