【Unity C#优化】业务逻辑代码方面的优化

代码方面的优化,主要是以降低内存的开辟和清理,提高CPU缓存命中率,利用多线程,为核心所进行的。

1.List与Dictionary的优化

List和Dictionary核心都是数组,Insert插入和Remove删除都要对数组进行复制和拷贝移动。并且每次扩容时,也会创建新的内存空间。

因此在创建时,最好规定一个预期容量,不要交给程序自己扩容。并且少用Insert插入接口。

2.巧用struct

struct是值类型,内存分配在栈上,栈是内存连续,回收快速简单,不会产生内存碎片,也不需要内存垃圾回收,CPU读取数据对连续内存很友好和高效。

struct数组的内存空间和值类型是连续的,调用时CPU的缓存命中率高。(CPU在读取数据时,会将数据缓存下来,下次先从缓存中找数据,如果命中,则不需要在内存中读取数据)

而class是引用类型,class数组中的每个对象都是堆上的独立内存空间,而数组的引用相当于C++的指针地址,数组中只有引用空间内存是连续的。缓存机制的命中率要照struct数组大大降低。

但如果struct太大,超过了缓存机制上线,则缓存机制不在起作用。可以使用值类型的数组来提高缓存命中率。

将A类的数组

Class A
{
	public int a;
	public float b;
	public bool c;
}

改为B类中的int数组、float数组、bool数组的形式

Class B
{
	public int[] a;
	public float[] b;
	public bool[] c;
}

A类数据是内存分散的,并且每个A的实例也是内存分散,只有arrayA的引用是连续的。

而B类中每个数组都是内存连续的(值类型的数组一定是内存连续),这样能更好地利用缓存,提高CPU读取数据时缓存的命中率。

3.对象池

使用对象池来减少对象的创建和回收。

对于普通对象也可以使用对象池,特别是使用List和Dictionary时,添加和回收都通过对象池进行操作。

可以大大降低内存的分配和释放所带来的消耗。

而且可以开局对对象池进行初始化,降低临时开辟内存所带来的开销。

4.string字符串相关

(1)缓存项目中的常用字符串

通过ID或Dictionary字典将项目中字符串缓存下来。下次调用时就不需要开辟新内存了。

(2)通过指针更改缓存字符串中的值

使用Dictionary字典缓存,字符串长度作为Key,字符串作为value。
使用字符串前,调用方法,如有相同长度的字符串,则通过指针将字符串中的值更改为期望值。

Dictionary<int, string> cacheStr;

Public unsafe string Concat(string strA, string strB)
{
	int a_length = strA.Length;	
	int b_length = strB.Length;	
	int sum_length = a_length + b_length;
	string strResult = null;
	
	if(!cacheStr.TryGetValue(sum_length, out strResult))
	{
		strResult = strA + strB;
		cacheStr.Add(sum_length, strResult);
		return strResult;
	}
	
	fixed(char* strA_ptr = strA)
	{
		fixed(char* strB_ptr = strB)
		{
			fixed(char* strResult_ptr =strResult)
			{
				memcopy((byte*)strResult_ptr, (byte*)strA_ptr, a_length * sizeof(char));
				
				memcopy((byte*)strResult_ptr + a_length, (byte*)strB_ptr, b_length * sizeof(char));
			}
		}
	}
	return strResult;
}

public unsafe void memcopy(byte* dest, byte* src, int len)
{
	while((--len) >= 0)
	{
		dest[len] = src[len];
	}
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真鬼123

祝你节节高升岁岁平安越来越漂亮

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值