Unity3D教程:盡量避免使用foreach
Posted on 2013年04月17日 by U3d / Unity3D 基礎教程 /被圍觀 425 次
* 版權聲明:轉載時請以超鏈接形式標明文章原始出處和作者信息
* 本文來自:Unity3D 教程手冊
* 本文鏈接: http://www.manew.com/4143.html
為什么要盡量避免使用foreach。GC Alloc是造成Unity游戲偶爾卡幀的罪魁禍首。第一個循環大概會造成2.3K的GC Alloc。第二個循環則沒有任何GC Alloc。所以,不要途方便,到處哪都用foreach循環。
foreach 語句為數組或對象集合中的每個元素重復一個嵌入語句組。foreach 語句用於循環訪問集合以獲取所需信息,但不應用於更改集合內容以避免產生不可預知的副作用。此語句的形式如下:
foreach (type identifier in expression) statement
其中:
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 | } |
