关于unity中foreach的使用

    网上有很多讨论关于在unity中使用foreach的方法,比如https://www.zhihu.com/question/30334270/answer/49934065中热烈的讨论,以前也经常在非update的地方使用foreach。下面来试一下就知道了,本测试中使用的是unity5.4.3p2和unity4.6.3f1两个版本。

    1.在unity5.4.3p2(64位)中测试,代码如下:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class ForeachTest : MonoBehaviour {

    private List list = new List();
	void Start () 
    {
	    for(int num = 0 ; num < 50 ; num++)
        {
            list.Add(num);
        }
	}
	void Update () 
    {
        ForeachFun();
        //ForFun();
	}

    void ForeachFun()
    {
       foreach(int num in list)
       {

       }
    }
    void ForFun()
    {
        for (int num = 0; num < list.Count; num++)
        {

        }
    }
}
测试结果如下图:

关于unity中foreach的使用_第1张图片

update中执行foreach

关于unity中foreach的使用_第2张图片

update中执行for

2.在unity4.6.3f1(32位)中使用一样的代码进行测试,结果如下:

关于unity中foreach的使用_第3张图片

update中执行foreach

update中执行for

3.也试着把Unity编出来的Assembly-CSharp.dll(Unity工程目录下Library\ScriptAssemblies中)拉到ildasm
工具中看一下,如图:

关于unity中foreach的使用_第4张图片http://write.blog.csdn.net/postedit?ref=toolbarhttp://write.blog.csdn.net/postedit?ref=toolbar

果然是产生了装箱操作。

3.总结

    从上面的profiler截图可以看出,在update中使用foreah的时候,32位和64位的产生的GC量不一样(本应该再用unity5.4.3.p2的32位测试一下会更严谨一些,但是懒得再装一个64位的了),上面的帖子中的网友给我们提供了几种解决方式;

关于unity中foreach的使用_第5张图片

最后看一下网友的讨论:https://www.zhihu.com/question/30334270/answer/49858731


你可能感兴趣的:(unity)