obsidian/笔记文件/2.笔记/Unity性能优化_第九章.md
2025-03-26 00:02:56 +08:00

74 lines
5.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## Unity合并网格
合并网格就是把多个网格合并为一个整体,从而提升游戏性能。
但是这样一来,我们就不能单独控制这些网格运动了,只能控制合并后的整个网格运动。而且合并的网格使用的材质必须是相同的,合并才可能成功,否则合并之后依然不能提升性能。
可以在Unity资源商店搜Mesh Combine下载相应的插件来实现合并网格的功能例如Easy Mesh Combine Tool等插件。
## Unity绘制调用Draw Call、批次Batch
要将游戏中的物体显示到屏幕上就需要绘制它们。绘制之前会先由CPU计算出它们的位置、颜色等信息然后发送绘制指令给GPU。GPU接受到CPU发过来的绘制指令就会按照要求绘制东西在屏幕上。
Draw Call是指CPU向GPU发送绘制指令的过程一个Draw Call就是CPU向GPU发送的一组绘制指令可以绘制出一个或多个物体。
Draw Call有时也被简称为DC
Draw Call太多会使游戏变卡优化的时候可以想办法降低Draw Call。
要降低Draw Call可以使用合批技术例如动态合批和静态合批。将多个Draw Call合批成一个批次Batch再由CPU发送给GPU这样可以提升游戏性能。
## Unity静态合批、Batching Static、StaticBatching类
静态合批也叫静态批处理是Unity的一种优化技术。
对于始终静止不动的物体使用静态合批后CPU会把它们合并为一个批次发送给GPU处理这样可以减少Draw Call带来的性能消耗从而提升游戏性能。
官方文档https://docs.unity3d.com/cn/current/Manual/static-batching.html
要使用静态合批必须确保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 根物体)
对指定的根物体的所有子孙物体进行静态合批。
只有当它们符合静态合批的所有条件,静态合批才会成功。
成功之后,这些物体就不能再运动了,强行运动会出问题。但是该根物体仍然允许运动。
StaticBatchingUtility.Combine(GameObject[] 要进行静态合批的游戏对象,GameObject 根物体)
对指定的游戏对象进行静态合批,并指定它们静态合批的根物体。
只有当它们符合静态合批的所有条件,静态合批才会成功。
成功之后,这些物体就不能再运动了,强行运动会出问题。但是该根物体仍然允许运动。
## Unity设置屏幕分辨率、设置默认屏幕分辨率
设置屏幕分辨率的方法1
Game窗口上方可以找到对应的下拉菜单点开它即可以选择屏幕分辨率。
VSyncGame view only表示垂直同步勾选后也只能在播放模式下的Game窗口才可能看出效果。
点击下面的+号可以添加自定义的屏幕分辨率。Label表示自定义的名字。Type选择Fixed Resolution则该分辨率是固定的即使缩放游戏窗口该分辨率也是固定的。Type选择Aspect Ratio缩放游戏窗口时该分辨率会随着窗口的缩放而变化但是仍会维持指定的纵横比。
右击一个屏幕分辨率,可以编辑和删除它。
设置屏幕分辨率的方法2
通过代码Screen.SetResolution方法可以设置屏幕分辨率
设置游戏启动时的默认屏幕分辨率:
Edit——Project Settings——Player——展开Resolution and Presentation下拉菜单——取消勾选Default Is Native Resolution——写上所需的屏幕宽度和屏幕高度