Unity-优化

性能分析器·

Unity 性能分析器 (Unity Profiler) 是一种可以用来获取应用程序性能信息的工具。可以将性能分析器连接到网络中的设备或连接到已连接到计算机的设备,从而测试应用程序在目标发布平台上的运行情况。还可以在 Editor 中运行性能分析器,从而在开发应用程序时概要了解资源分配情况。
性能分析器可以收集并显示有关应用程序各个方面(例如 CPU、内存、渲染器和音频)的性能数据。该工具可用于识别应用程序中可提高性能的方面,并在这些方面进行迭代。您可以查明代码、资源、场景设置、摄像机渲染和构建设置如何影响应用程序性能等方面的情况。性能分析器在一系列图表中显示结果,因此可以直观地查看应用程序性能出现尖峰的位置。

要访问 Profiler 窗口,请选择菜单:Window > Analysis > Profiler。有关该窗口的详细概述,请参阅 Profiler 窗口文档。

参考资料·

用于识别问题的配置文件代码
Unity查看当前内存使用情况(针对移动端开发)
Unity Profiler分析器-Rendering

对象池·

对象池是游戏编程中非常常用的优化策略以及设计模式。

游戏中,我们常常会遇到频繁地创建销毁大量相同对象的场景。频繁的创建对象会造成GCGarbage Collection,垃圾回收
压力,可能导致卡顿,进而影响游戏体验。

本地笔记链接:对象池技术

简易的对象池实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/// <summary>
/// 对象池本体
/// </summary>
public List<GameObject> pooledObjects;
/// <summary>
/// 对象池要管理的对象
/// </summary>
public GameObject objectToPool;
/// <summary>
/// 对象池中需要初始化对象的个数
/// </summary>
public int amountToPool;

void Start()
{
PoolStart(); // 初始化对象池
}

/// <summary>
/// 初始化对象池,克隆对象并将它们添加到列表中
/// </summary>
void PoolStart()
{
pooledObjects = new List<GameObject>();
for (int i = 0; i < amountToPool; i++)
{
GameObject obj = (GameObject)Instantiate(objectToPool);
obj.SetActive(false);
pooledObjects.Add(obj);
obj.transform.SetParent(this.transform); // 设置其父对象是 脚本所附加对象
}
}

GameObject GetPooledObject()
{
// For as many objects as are in the pooledObjects list
for (int i = 0; i < pooledObjects.Count; i++)
{
// if the pooled objects is NOT active, return that object
if (!pooledObjects[i].activeInHierarchy)
{
return pooledObjects[i];
}
}
// otherwise, return null
return null;
}

功能较完善的对象池实现:ObjectPool.cs

参考资料·

  1. 对象池_百度百科 (baidu.com)
  2. [游戏编程技巧]-对象池 - 知乎 (zhihu.com)
  3. 对象池(Object Pool) - 知乎 (zhihu.com)

垂直同步 - V Sync Count·

public static int vSyncCount ;

垂直同步数。值必须为 0、1、2、3 或 4。
应在每帧之间传递的垂直同步数。使用 ‘Don’t Sync’ (0) 则不等待垂直同步。

如果此设置被设置为非“Don’t Sync”(0),则将忽略 Application.targetFrameRate 的值。

注意:这在 iOS 上不适用,在 iOS 上会忽略 VSync 设置。在 iOS 上,设备在 VBlank 上显示帧。如果因设置的 Application.targetFrameRate 或性能低而缺失 VBlank,则帧显示在下一个上。

与Application.targetFrameRate的关联·

如果 vSyncCount 的设置不为 0,则将忽略 Application.targetFrameRate 的值。

Application.targetFrameRate:设置该值不能保证帧速率为目标值,可能由于平台的特殊性而出现波动,或者由于计算机速度太慢,游戏可能无法达到帧速率。它有三个特殊值:

Application.targetFrameRate=-1:使游戏尽可能快地渲染
Application.targetFrameRate=30:一般在手机游戏中,设置帧率为30
Application.targetFrameRate=60:网页播放器游戏的渲染速度一般为50-60帧/秒

垂直同步对画面撕裂的影响·

打开垂直同步能防止游戏画面高速移动时画面产生撕裂现象。

我们平时运行操作系统一般显示器刷新率是在60左右,显卡会按照每60的频率时间来发送一个垂直同步信号,如果我们选择“等待垂直同步信号”(也就是我们平时所说的“垂直同步打开”),那么在游戏中,或许强劲的显卡迅速的绘制完一屏的图像,但是没有垂直同步信号的到达,显卡无法绘制下一屏,只有等60单位的信号到达,才可以绘制;而如果我们选择“不等待垂直同步信号”(也就是我们平时所说“关闭垂直同步”),那么游戏绘制完一屏画面,显卡和显示器无需等待垂直同步信号,就可以开始下一屏图像的绘制,自然可以完全发挥显卡的实力。

正是因为垂直同步的存在,才能使得游戏刷新率和显示器刷新率同步,使得画面平滑,使得画面稳定。取消了垂直同步信号,固然可以换来更快的速度,但是在图像的连续性上,性能势必打折扣。

通常渲染要慢的多,开了垂直同步,计算机就会等待上一张图片渲染完成后才会发出开始下一张渲染的命令;不开垂直同步,那么计算机就急不可待的想把算好的结果渲染在屏幕上,这样就容易出现上一张还没有渲染完,又来新的图来覆盖,时间差大到一定程度就会出现屏幕撕裂。