欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > 【Unity C#优化】业务逻辑代码方面的优化

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

2025/7/2 13:35:01 来源:https://blog.csdn.net/boyZhenGui/article/details/140533896  浏览:    关键词:【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];}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词