Unity性能提升

前言

如果游戏很卡就毫无乐趣可言.这篇文章涵盖了一些每个Unity开发者应当知道的用以保证玩家开心的性能提升(建议).

算法与数据结构

当涉及到游戏性能时的大头是开发者有关高效算法和数据结构的知识.这个话题太大以至于不能够在这里展开说明.如果你是编程新手,尝试看下下列话题并弄明白什么时候用它们最好:

  • 列表(Lists)
  • 链接表(Linked List)
  • 哈希表(HashMaps)
  • 树(Trees)
  • 队列(Queues)
  • 栈(Stacks)
  • 排序,快速排序,冒泡排序等等(Sorting,QuickSort,BubbleSort,...)
数学

为了让我们保持正常,这篇文章中我们将不会涵盖数学,然而数学对于性能是很重要的.想象下我们场景中的一个怪.玩家现在向怪物射击----我们如何判断他打到了它?

有无数种方式来做,它们都包含数学.你的工作就是了解他们并且决定那个方法是要用的最佳方法.幸运的是,Unity已经给我们提供了很多方法来做这件工作.尽管如此,在不能找到合适的方法时数学就来了.

网格

我们讨论些不费力就能够学到并应用的东西:优化网格.当制作游戏时我们通常在场景中有大量的3D模型.每个模型都由所谓的网格构成.一个网格只是一系列的三角形而已.三角形数量越多,帧率(FPS)就越低,所以将其数目保持在最低是最重要的

比如,一个仅有4000个三角形的怪物模型已经看起来挺漂亮了,完全没有必要使用一个有百万个三角形的怪物模型.大多数的3D建模程序已经有了网格优化功能,用不用由你.

如果没办法非要用有许多三角形的网格,还有另外一个选项:LOD(细节级别).LOD的概念很简单:当一个网格远离摄像机,它被修改以便有较少的三角形.玩家看不出差异来,因为它离摄像机较远.Unity支持这样的功能,所以可以找时间试试.

缓存GetComponent

访问GameObject的组件通常是使用GetComponent函数来搞的.在计算量方面这个函数开销是很昂贵的.
现在我们看一个有关如何使用它的例子

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour
{
	void Start()
	{
		
	}

	void Update()
	{
		Health h = GetComponent<Health>();
		h.increaseBy(100);
	}
}
这个例子很糟糕,因为每个Update(大约每秒60次)函数都会调用GetComponent一次.这个可以很容易的像这样进行改进:

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour
{
	//Cache
	Health h;

	void Start()
	{
		h = GetComponent<Health>();
	}

	void Update()
	{
		h.increaseBy(100);
	}
}
这个例子就好多了.它提供了同样的功能,然而计算量很少因为GetComponent只在开始时调用了一次,不再是每秒钟调用60次了.

Unity的快捷属性

为了让我们用起来更方便,Unity提供了一种不使用GetComponent函数来获取标准组件的方法,这里是一系列的这些快捷访问的列表:

  • rigidbody
  • camera 
  • light
  • animation 
  • renderer 
  • audio 
  • guiText 
  • collider 
  • transform 
  • gameObject 
  • particleEmitter 
  • particleSystem
他们用起来如下:

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour
{
	void Start()
	{
		
	}
	
	void Update()
	{
		Vector3 pos = transform.position;
	}
}
要知道这段代码进行了大量计算需要对Unity有些了解.原因是其实际做的如下:

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour
{
	void Start()
	{
		
	}
	
	void Update()
	{
		Vector3 pos = GetComponent<Transform>().position;
	}
}
尽管看上去不像,其仍然每次使用GetComponent,这在我们上面提到过是很耗的.

恰当的方法是这样来:

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour
{
	//Cache
	Transform tr;

	void Start()
	{
		tr = transform;
	}
	
	void Update()
	{
		Vector3 pos = tr.position;
	}
}

GUIs

当使用GUIs,方便的方法通常是使用GUILayout而不是GUI类.遗憾的是GUILayout比GUI类慢得多,所以你要再三考虑这样做是否值得

Shader

Shader能够使显卡完全疯掉(耗掉大量资源).除非你是一个Shader专家,最好只使用Unity提供的Shader是一个好方法.除此之外,也有后缀有Mobile字样的Unity shader.这些shader是特别为手机制作的,但他们仍旧能在普通电脑上带来性能的提升.

注:Unity的shader都是精心制作的,但是他们仍旧比较耗.用起来要节制,少即是多

Baking

http://noobtuts.com/unity/performance-improvements


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值