關(guān)于這個(gè)話題,網(wǎng)絡(luò)上討論的很多,我也收集了一些資料,都不是很齊全,所以自己親自測試,這里把結(jié)果分享給大家。

foreach究竟怎么了?

研究過這個(gè)問題的人都應(yīng)該知道,就是它會(huì)引起頻繁的GC Alloc。也就是說,使用它之后,尤其在Update方法中頻繁調(diào)用時(shí),會(huì)快速產(chǎn)生小塊垃圾內(nèi)存,造成垃圾回收操作的提前到來,造成游戲間歇性的卡頓。
問題大家都知道,也都給出了建議,就是盡可能不要用。在start方法里倒無所謂,因?yàn)楫吘顾粓?zhí)行一次。Update方法一秒鐘執(zhí)行大概50-60次,這里就不要使用了。這個(gè)觀點(diǎn)整體上是正確的,因?yàn)檫@樣做畢竟避開了問題。
不過有一點(diǎn)點(diǎn)不是很方便的就是,foreach確實(shí)帶來了很多便捷性的編碼。尤其是結(jié)合了var之后,那么我們究竟還能不能使用它,能使用的話,應(yīng)該注意哪些問題?帶著這些問題,我做了以下的測試。

重現(xiàn)GC Alloc問題

首先,我寫了一個(gè)簡單的腳本來重現(xiàn)這個(gè)問題。
這個(gè)類中包括一個(gè)int數(shù)組,一個(gè)泛型參數(shù)為int的List。
代碼如下:

using UnityEngine;using System.Collections;using System.Collections.Generic;public class ForeachTest : MonoBehaviour {    int[] m_intArray;
    List<int> m_intList;
    ArrayList m_arryList;    public void Start () 
    {
        m_intArray = new int[2];
        m_intList = new List<int>();
        m_arryList = new ArrayList();        for (int i = 0; i < m_intArray.Length; i++)
        {
            m_intArray[i] = i;
       &nbs