Unity性能优化之网格和动画文件

实际上,网络和动画文件的这些文件类型是顶点和蒙皮骨骼数据的大型数组,可以通过各种技术最小化文件大小,同时缺不影响外观的相似性,与此同时,也有一些方式可以通过批处理技术降低渲染大量的这类对象组的成本;

优化之路;

  1. 减少多边形数量
  2. 调整网格压缩
  3. 恰当的使用Read-Write Enabled
  4. 合并网格
  5. Asset Bundle 和Resource
减少多边形数量

这是最有效的提升性能的方法之一,应该始终考虑这方面的优化,事实上,由于不能使用SkinnedMesh Render对对象进行批处理,因此,这是减少动画对象的CPU和GPU运行时开销的好方法之一;正常情况下,对象的大部分细节几乎完全都是通过精细的纹理和复杂的阴影来实现的,所以一般来说,我们减少网格的顶点,是不会影响游戏体验的,同时还可以减少CPU和内存成本;

调整网格压缩

unity为导入的网格文件提供了4中不同的网格压缩设置:OFF、Low、Medium、High;
Unity性能优化之网格和动画文件_第1张图片
通过此设置可以将浮点数数据转化为固定值,降低顶点位置/法线方向的精度,简化顶点颜色信息等,如果是那种包含了彼此相邻的小部件(比如栏杆或者格栏杆)的网格有明显的影响, 同时如果使用代码来生成网格,可以调用MeshRender组件的Optimize()方法来实现相同类型的压缩;
Unity性能优化之网格和动画文件_第2张图片

在projectsetting中的other下面有两个属性 Vertex Compression 和optimize Mesh Data也是可以影响导入的网格方式;
Vertex Compression是一个全局的设置,他会影响所有导入的网格,但是可以根据不同平台进行配置,当启用Mesh Compression的情况下使用Vertex Compression 可以优化导入 的网格,因此如果想要精确的法线数据,但是不关心位置数据,就可以在这里配置它,

开启Optimize Mesh Data 将提出该网格当前使用的材质不需要的数据,因此如果网格中包含切线信息,但是着色器不需要切线信息,那么Unity在构建期间将会忽略它;
在不同的情况下,开启这些选项的好处就是减少了应用程序的磁盘占用,但是缺要花费额外的时间去加载网格,因为在需要数据之前,必须要花费额外的时间去解压缩数据;
一般来说 3D网格/动画制作工具都会提供内置的自动优化网格的方法;

恰当的使用Read-Write Enabled

这个标记是允许在运行时通过脚本修改网格,或者在运行时允许Unity自动对网格进行更改,类似于纹理文件上的方式,在内部这意味着吧原始网格数据保存在内存中,直到我们想要复制他并且动态的进行修改,那么禁用这个选项代表着当Unity确定最终的网格后,从内存中丢弃原始数据,(因为永远不会修改原始网格数据);
如果在整个游戏中只使用网格的等比缩放版本,那么禁用它将会节省运行时内存,原因是:在游戏中不会再需要原始网格数据来制作网格的重新缩放版本,因此,Unity应该尽早丢掉这些不需要的数据;
另一方面,如果再游戏中网格经常需要在运行时以不同的比例重新出现,那么Unity需要将原始的网格数据保存在内存中,一遍可以更快的重新计算新的网格,如果这个时候要禁用它,那么unity不仅需要在每次重新引入网格的时候重新加载数据,同时还要制作重新缩放的版本,这样会导致潜在的性能问题;

合并网格

将网格强力的合并成单个的打行网格,可以减少DrawCall,特别是当网格对于动态批处理来说太大,并且不能和其他静态批处理组很好的配合的时候,何以手动执行以下,所以,如果静态批处理可以很好的处理这个过程的时候,我们就不必去浪费精力了;
注意:如果网格的任何单个顶点在场景中可见,那么可以将整个对象作为一个整理进行渲染,如果网格在大部分时间里只是部分可见,那么这将会浪费大量的处理时间;这种技术的缺点就是,他在执行之后会生成一个全新的网格文件,必须要保存到场景中,你对原始网格做的任何更改都不会影响它;
在AssetStore或者google上也可以搜到类似的工具;

Assetbundle和Resource

untiy 的resource system在项目早期很有益处,也能够在有限范围的游戏中高效的使用,但是 Resource system的伸缩性不是很大,所有的资源都合并到一个大型的序列化文件二进制数据中,其中包含了一个索引表,列出了可以在其中找到的各种资源,但是当向列表中添加更多数据的时候,这可能很难管理,并且需要很长时间来构建;
同时,Resources System 很难基于不同的设备提供不同的素材数据;
但是AssetBundle 很容易实现这一点,并且Asset Bundle可以用于为应用程序提供小性的、自定义的内容更新,但是Resourcessystem则需要完全的替换整个程序,才能达到相同的效果;

Assetbundle于Resource拥有很多相同的功能,比如从文件中加载,异步加载数据和卸载不再需要的数据,Assetbundle还提供了更多的功能,比如内容流式传输,内容更新、内容生成和共享,这些都可以极大的提高应用程序的性能,可以提供磁盘空间占用更小的应用程序,让用户在开始游戏之前或在游戏运行过程中下载额外的内容,在运行时流式传输素材,以最小化应用程序首次加载时间;
其缺点就是建立和维护比resource更加复杂,需要更多的QA测试来确保服务器可以正常交付资源,确保游戏读取和更新对应的内容;

个人学习记录,参考unity游戏优化

你可能感兴趣的:(性能优化,unity,性能优化,游戏引擎)