1. 尽量避免每帧处理, 可以每隔几帧处理一次
比如:
[C#] 纯文本查看 复制代码
| function Update() { DoSomeThing(); } |
可改为每5 帧处理一次:
[C#] 纯文本查看 复制代码
| function Update() { if (Time.frameCount % 5 == 0) { DoSomeThing(); } } |
2. 定时重复处理用InvokeRepeating 函数实现
比如,启动0.5 秒后每隔1 秒执行一次 DoSomeThing 函数:
[C#] 纯文本查看 复制代码
1 | function Start() { InvokeRepeating( "DoSomeThing" , 0.5, 1.0); } CancelInvoke( "你调用的方法" ); 停止InvokeRepeating |
3. 优化 Update,FixedUpdate, LateUpdate 等每帧处理的函数, 函数里面的变量尽量在头部声明。
比如:
[C#] 纯文本查看 复制代码
| function Update() { var pos: Vector3 = transform.position; } |
可改为
[C#] 纯文本查看 复制代码
| private var pos: Vector3; function Update(){ pos = transform.position; } |
4. 主动回收垃圾
给某个 GameObject 绑上以下的代码:
[C#] 纯文本查看 复制代码
| function Update() { if (Time.frameCount % 50 == 0) { System.GC.Collect(); } } |
5. 运行时尽量减少 Tris 和 Draw Calls
预览的时候,可点开 Stats ,查看图形渲染的开销情况。特别注意 Tris 和 Draw Calls 这两个参数。
一般来说,要做到:
Tris 保持在 7.5k 以下
Draw Calls 保持在 35 以下
6. 压缩 Mesh
导入 3D 模型之后,在不影响显示效果的前提下,最好打开 Mesh Compression 。
Off, Low, Medium, High 这几个选项,可酌情选取。 对于单个Mesh最好使用一个材质。
7. 避免大量使用 Unity 自带的 Sphere 等内建 Mesh
Unity 内建的 Mesh ,多边形的数量比较大,如果物体不要求特别圆滑,可导入其他的简单3D 模型代替。
8. 优化数学计算
尽量避免使用float,而使用int,特别是在 中,尽量少用复杂的数学函数,比如sin,cos等函数。改除法/为乘法,例如:使用x*0.5f而不是 x/2.0f 。
9.如果你做了一个图集是1024X1024 的。此时你的界面上只用了图集中的一张很小的图,那么很抱歉1024X1024 这张大图都需要载入你的内存里面,1024 就是4M 的内存,如果你做了10 个1024 的图集,你的界面上刚好都只用了每个图集里面的一张小图,那么再次抱歉你的内存直接飙40M 。意思是任何一个4096 的图片,不管是图集还是texture ,他都占用4*4=16M ?
====================================================================分割线=====================================================
1、在使用数组或ArrayList对象时应当注意
[C#] 纯文本查看 复制代码
1 2 3 4 | length=myArray.Length; for ( int i=0;i<length;i++) { } |
[C#] 纯文本查看 复制代码
1 2 3 | for ( int i=0;i<myArray.Length;i++) { } |
[C#] 纯文本查看 复制代码
1 2 3 4 | void Update() { Vector3 pos; pos=transform.position; } |
[C#] 纯文本查看 复制代码
1 2 3 4 | private Vector3 pos; void Update() { pos=transform.position; } |
[C#] 纯文本查看 复制代码
1 2 3 4 | privateTransform myTrans; void Start() { myTrans=transform; } |
[C#] 纯文本查看 复制代码
| transform.localPosition += new Vector3 ( 10.0f * Time.deltaTime, 0.0f, 0.0f ); |
[C#] 纯文本查看 复制代码
| Vector3 offset = new Vector3( my.localPosition.x * parent.lossyScale.x, my.localPosition.y * parent.lossyScale.y, my.localPosition.z * parent.lossyScale.z );Vector3 worldPosition = parent.position + parent.rotation * offset; |
[C#] 纯文本查看 复制代码
| transform.Translate ( 10.0f * Time.deltaTime, 0.0f, 0.0f ); |
[C#] 纯文本查看 复制代码
| public float foobar = 1.0f; |
[C#] 纯文本查看 复制代码
01 02 03 04 05 06 07 08 09 10 11 12 13 | public class TestCurve : MonoBehaviour { public float foobar = 0.0f; IEnumerator Start () { yield return new WaitForSeconds (2.0f); animation.Play( "foobar_op" ); InvokeRepeating ( "LogFoobar" , 0.0f, 0.2f ); yield return new WaitForSeconds (animation[ "foobar_op" ].length); CancelInvoke ( "LogFoobar" ); } void LogFoobar () { Debug.Log( "foobar = " + foobar); }} |
[C#] 纯文本查看 复制代码
| public class foo : MonoBehaviour { ...} public class bar : foo { ...} |
[C#] 纯文本查看 复制代码
| foo comp1 = A.GetComponent<foo>();bar comp2 = B.GetComponent<bar>(); |
[C#] 纯文本查看 复制代码
| foo comp2 = B.GetComponent<foo>(); |
[C#] 纯文本查看 复制代码
| Time.timeScale = 0.0f |
[C#] 纯文本查看 复制代码
| IEnumerator CoLog () { yield return new WaitForSeconds (2.0f); Debug.Log( "hello foobar" );} |
[C#] 纯文本查看 复制代码
| TestCoroutine testCo = GetComponent<TestCoroutine>();testCo.CoLog ();testCo.StartCoroutine ( "CoLog" ); |
[C#] 纯文本查看 复制代码
| StartCoroutine ( Foobar() );InvokeRepeating ( "Foobar" , 0.0f, 0.1f ); |
[C#] 纯文本查看 复制代码
| StopAllCoroutines ();CancelInvoke (); |
[C#] 纯文本查看 复制代码
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 | // class TestCortouine public class TestCoroutine : MonoBehaviour { public IEnumerator CoLog ( string _name ) { Debug.Log(_name + " hello foobar 01" ); yield return new WaitForSeconds (2.0f); Debug.Log(_name + " hello foobar 02" ); }} // component attached on GameObject A public class A: MonoBehaviour { public GameObject B; void Start () { TestCoroutine compB = B.GetComponent<TestCoroutine>(); // GOOD, thread state in B // same as: comp B.StartCoroutine ( "CoLog" , "B" ); compB.StartCoroutine ( compB.CoLog( "B" ) ); // BAD, thread state in A StartCoroutine ( compB.CoLog( "A" ) ); Debug.Log( "Bye bye A, we'll miss you" ); Destroy(gameObject); // T_T I don't want to die... }} |
[C#] 纯文本查看 复制代码
| public class Update_01 : MonoBehaviour { void Start () {} void Update () {}} |
[C#] 纯文本查看 复制代码
1 | public class Update_02 : MonoBehaviour { } |
[JavaScript] 纯文本查看 复制代码
1 2 3 | function Update () { transform.Translate(0, 1, 0); } |
[JavaScript] 纯文本查看 复制代码
01 02 03 04 05 06 07 08 09 10 11 12 | var myTransform : Transform; function Awake () { myTransform = transform; } function Update () { myTransform.Translate(0, 1, 0); } |
[JavaScript] 纯文本查看 复制代码
1 2 | function Awake () { useGUILayout = false ; } |
[C#] 纯文本查看 复制代码
1 2 3 | if (Time.frameCount % 30 == 0) { System.GC.Collect(); } |
[JavaScript] 纯文本查看 复制代码
1 2 3 4 5 6 7 8 | function Start() { var tmp = new System.Object[1024]; // make allocations in smaller blocks to avoid them to be treated in a special way, which is designed for large blocks for ( var i : int = 0; i < 1024; i++) tmp = new byte[1024]; // release reference tmp = null ; } |