[Unity优化]减少gc

版权声明:欢迎转载,欢迎讨论,大家一起共同进步!呵呵哒~ https://blog.csdn.net/lyh916/article/details/52194998

参考链接:

http://www.cnblogs.com/mrkelly/p/5391156.html#3415238

http://www.cnblogs.com/murongxiaopifu/p/4284988.html#GC


一.减少使用foreach

首先回顾一下IEnumerable和IEnumerator

    public interface IEnumerable
    {
        IEnumerator GetEnumerator();
    }

    public interface IEnumerator
    {
        bool MoveNext();
        object Current { get; }
        void Reset();
    }

如果一个集合要使用foreach进行遍历,那么需要实现IEnumerable这个接口。

下面回到正题,测试一下:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class TestCSharp : MonoBehaviour {

    private List<int> list = new List<int>();
    private Dictionary<int, int> dict = new Dictionary<int, int>();
    private int sum;

	void Start () 
    {
        for (int i = 0; i < 1000; i++)
        {
            list.Add(i);
            dict.Add(i, i);
        }

        sum = 0;
        Profiler.BeginSample("ForList");
        for (int i = 0; i < list.Count; i++)
        {
            sum += i;
        }
        Profiler.EndSample();
        Debug.Log(sum);

        sum = 0;
        Profiler.BeginSample("ForeachList");
        foreach (var item in list)
        {
            sum += item;
        }
        Profiler.EndSample();
        Debug.Log(sum);

        sum = 0;
        Profiler.BeginSample("EnumeratorList");
        var listEnumerator = list.GetEnumerator();
        while (listEnumerator.MoveNext())
        {
            sum += listEnumerator.Current;
        }
        Profiler.EndSample();
        Debug.Log(sum);

        ///////////////////////////////////////////////////////////////

        sum = 0;
        Profiler.BeginSample("ForDict");
        //字典可以看作两个list,一个list存key,一个list存value
        //两个list是一一对应的关系
        List<int> keys = new List<int>(dict.Keys);
        for (int i = 0; i < dict.Count; i++)
        {
            sum += dict[keys[i]];
        }
        Profiler.EndSample();
        Debug.Log(sum);

        sum = 0;
        Profiler.BeginSample("ForeachDict");
        foreach (var item in dict)
        {
            sum += item.Value;
        }
        Profiler.EndSample();
        Debug.Log(sum);

        sum = 0;
        Profiler.BeginSample("EnumeratorDict");
        var dictEnumerator = dict.GetEnumerator();
        while (dictEnumerator.MoveNext())
        {
            sum += dictEnumerator.Current.Value;
        }
        Profiler.EndSample();
        Debug.Log(sum);
	}
	
}



结论:从gc和速度来看,使用GetEnumerator()来遍历集合是最好的。这里我建议使用for遍历list,使用GetEnumerator遍历字典。


二.减少使用引用类型

引用类型存放在内存堆上,当引用类型不再被使用时,就会触发gc。

Ps:string是引用类型

猜你喜欢

转载自blog.csdn.net/lyh916/article/details/52194998