网上有很多讨论关于在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