unity程序优化(一)

一、正确操作字符
字符串在我们编程过程中使用的最频繁的一种基础数据类型,使用不慎就会带来额外的性能开削。
string str=”string1”+100;
string str1=”string1”+100.ToString();
第一行代码会有一次装箱操作,第二行代码ToString()调用的是一个非托管的方法。ToString方法如下:
[SecurityCritical]
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern string FormatInt32(int value, string format, NumberFormatInfo info);
在我们频繁处理字符串的时候会生成很多零时字符串,这样就会带来性能损耗,此时我们应该用StringBuilder来代替string.
在编码的处理字符串的时候,1、避免装箱操作,2、尽可能的减少零时字符串的产生
二、给对象创建比较器
在某些情况下,我们需要用到排序,这时候我们在写代码的时候,可以创建一个比较器来实现排序。比如在ui上要显示学生的成绩排序

    public class Student : IComparable
    {
        public string Name;
        public int Score;
        public int Age;
        public int CompareTo(object obj)
        {
            Student s = obj as Student;
            return Score.CompareTo(s.Score);
        }
    }
     static void Main(string[] args)
        {
            List list = new List();
            list.Add(new Student() { Name = "小强", Score = 100 ,Age=22});
            list.Add(new Student() { Name = "张三", Score = 20, Age = 10 });
            list.Add(new Student() { Name = "小丽", Score = 60 , Age = 30 });
            list.Add(new Student() { Name = "小虎", Score = 55, Age = 25 });
            list.Sort();
            foreach(var v in list)
            {
                Console.WriteLine(string.Format("{0} socre is :{1}",v.Name,v.Score));
            }
            Console.ReadKey();
        }
    }

结果为

张三 socre is :20
小虎 socre is :55
小丽 socre is :60
小强 socre is :100
现在我改变注意了,我要实现按年龄排序,我们可能回去改CompareTo方法,如果类比较多的时候,你这样改多费劲呢,这时我们可以自定义一个比较器,继承于IComparer

 public class AgeComparer : IComparer
    {

        public int Compare(Student x, Student y)
        {
            return x.Age.CompareTo(y.Age);
        }
    }
    main函数调用如下:
       list.Sort(new AgeComparer());

输出结果如下:
张三 socre is :20 age :10
小强 socre is :100 age :22
小虎 socre is :55 age :25
在这其实我建议使用泛型的比较器,这样就不用类型转换了,如果集合比较大,类型转换就会影响性能,所以用IComparable和IComparer替换IComparable,IComparer是可取的。Student类更改如下:

    public class Student : IComparable
    {
        public string Name;
        public int Score;
        public int Age;
        public int CompareTo(Student other)
        {
            return Score.CompareTo(other.Score);
        }
    }

三、深拷贝和浅拷贝
浅拷贝:将对象中的所有字段复制到新的对象(副本)中,值类型字段的值被复制到副本中后,在副本中修改不会影响到与对象对应的值,而引用类型的字段被复制到副本中的是引用类型的引用,而不是引用对象本身,在副本中对引用类型的字段修改会影响到源数据。
深拷贝:同样是将所用字段复制到新对象,只不过不论是值类型字段还是引用类型的字段,都会重新创建并赋值,对副本的修改不会影响源数据。
实现浅拷贝我们只需要使用MemberwiseClone就可以了
//
// 摘要:
// 创建当前 System.Object 的浅表副本。
//
// 返回结果:
// 当前 System.Object 的浅表副本。
[SecuritySafeCritical]
protected Object MemberwiseClone();

 public class Student :ICloneable
    {
        public string Name;
        public int Score;
        public int Age;

        public object Clone()
        {
            return this.MemberwiseClone();
        }
        //深拷贝
        public Student DeepClone()
        {
            using (Stream st = new MemoryStream())
            {
                IFormatter format = new BinaryFormatter();
                format.Serialize(st, this);
                st.Seek(0, SeekOrigin.Begin);
                return format.Deserialize(st) as Student;
            }
        }
        //浅拷贝
        public Student ShallowClone()
        {
            return Clone() as Student;
        }
    }

你可能感兴趣的:(C#,Unity3d)