lyh916

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  201 随笔 :: 0 文章 :: 12 评论 :: 21万 阅读

参考链接:

https://www.cnblogs.com/zblade/p/6445578.html

http://www.manew.com/thread-101174-1-1.html

 

gc是代码层面上的,分为lua的gc和c#的gc

lua:注意table的使用,例如为了减少lua和c#的交互,会在lua层上用table来实现Vector3,这时如果在update中进行Vector3运算就会大量地分配Vector3

c#:注意装箱操作,还有方法的返回,例如如果方法返回的是一个数组,那么说明执行这个方法时会分配内存产生一个新的数组,从而产生gc

 

以下都是测试过的:

1.GameObject.name和GameObject.tag会产生gc,替代方案为GameObject.CompareTag

2.Input.touches会产生gc,替代方案为Input.touchCount配合Input.GetTouch

3.Physics.SphereCastAll会产生gc,替代方案为Physics.SphereCastNonAlloc

从2和3可以看出,如果方法返回的是一个数组,那么说明执行这个方法时会分配内存产生一个新的数组,从而产生gc

 

4.装箱操作(值类型转化为引用类型)会产生gc,典型的例子为Debug.Log,其方法签名是public static void Log(object message);

5.StartCoroutine会产生gc

6.yield return 0会产生gc(因为装箱操作),替代方案为yield return null

7.yield return new WaitForSeconds(0.1f)会产生gc(因为new一个对象),替代方案为:

WaitForSeconds waitForSeconds = new WaitForSeconds(0.1f);
IEnumerator A()
{
    while (true)
    {
        yield return waitForSeconds;
    }
}

 

8.foreach几乎不会产生gc(unity5.5版本修复了,但第一次执行foreach仍会触发gc)

posted on   艰苦奋斗中  阅读(685)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示