关于unity中foreach的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ethuangfen/article/details/53784946

    网上有很多讨论关于在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<int> list = new List<int>();
	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++)
        {

        }
    }
}
测试结果如下图:

update中执行foreach

update中执行for

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

update中执行foreach

update中执行for

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

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位的了闭嘴),上面的帖子中的网友给我们提供了几种解决方式;

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


展开阅读全文

没有更多推荐了,返回首页