Posted on 2013年04月17日 by U3d / Unity3D 基础教程 /被围观 425 次html
* 版权声明:转载时请以超连接形式标明文章原始出处和做者信息express
* 本文来自:Unity3D 教程手册数组
* 本文连接: http://www.manew.com/4143.htmlide
为何要尽可能避免使用foreach。GC Alloc是形成Unity游戏偶尔卡帧的罪魁祸首。第一个循环大概会形成2.3K的GC Alloc。第二个循环则没有任何GC Alloc。因此,不要途方便,处处哪都用foreach循环。this
foreach 语句为数组或对象集合中的每一个元素重复一个嵌入语句组。foreach 语句用于循环访问集合以获取所需信息,但不该用于更改集合内容以免产生不可预知的反作用。此语句的形式以下:3d
foreach (type identifier in expression) statementcode
其中:htm
type对象
identifier 的类型。教程
identifier
表示集合元素的迭代变量。若是迭代变量为值类型,则没法修改的只读变量也是有效的。
expression
对象集合或数组表达式。集合元素的类型必须能够转换为 identifier 类型。请不要使用计算为 null 的表达式。
而应计算为实现 IEnumerable 的类型或声明 GetEnumerator 方法的类型。在后一种状况中,GetEnumerator 应该要么返回实现 IEnumerator 的类型,要么声明 IEnumerator 中定义的全部方法。
statement
要执行的嵌入语句。
举一个代码列子:
01 | using UnityEngine; |
02 | using System.Collections; |
03 | |
04 | public class ForeachTest : MonoBehaviour { |
05 | |
06 | protected ArrayList m_array; |
07 | |
08 | void Start () |
09 | { |
10 | m_array = new ArrayList(); |
11 | for (int i = 0; i < 2; i++) |
12 | m_array.Add(i); |
13 | } |
14 | |
15 | void Update () |
16 | { |
17 | for (int i = 0; i < 1000; i++) |
18 | { |
19 | foreach (int e in m_array) |
20 | { |
21 | //big gc alloc!!! do not use this code! |
22 | } |
23 | } |
24 | |
25 | for (int i = 0; i < 1000; i++) |
26 | { |
27 | for (int k = 0; k < m_array.Count; k++) |
28 | { |
29 | //no gc alloc!! |
30 | } |
31 | } |
32 | } |
33 | } |