Unity中的GC及其优化

本文探讨了Unity中GC的工作原理,包括堆内存分配、GC执行过程及带来的问题。针对这些问题,提出了如何定位堆内存分配、减少GC时间和频率以及避免垃圾产生的优化策略,如缓存、对象池、减少字符串操作等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

=====堆内存分配时候,unity做了什么:

1.首先,Unity检查堆上是否有足够的空闲内存,如果有,则该变量的内存被分配;

2.如果没有,Unity触发GC试图释放未使用的堆内存,这个操作可能很慢。如果GC之后堆内存足够,则该变量的内存被分配;

3.如果GC之后堆上还是没有足够的空闲内存,Unity将向操作系统申请更多内存以扩大堆大小。这个操作可能很慢。之后该变量的内存被分配

所以,堆分配可能会很慢,特别在必须执行GC和扩大堆大小时。

=====GC时,发生了什么:

当堆变量超出作用域后,存储该变量的内存并没有被立即释放。无用的堆内存只在执行GC时被释放。

每次执行GC时,将执行以下步骤:

  • 垃圾收集器检索堆上的每个对象。
  • 垃圾收集器搜索所有当前对象引用以确定堆上的对象是否仍在作用域内。
  • 不在作用域内的对象被标记为删除。
  • 删除被标记的对象并将内存返回给堆。

GC是个费时的操作,堆上的对象越多,代码中的引用数越多,GC就越费时

=====GC带来的问题

1.最明显的问题是GC可能花费相当长的时间来运行(如果堆上有很多对象和大量的对象引用要检查,则检查所有这些对象的过程可能很慢。 这可能会导致我们的游戏卡顿或运行缓慢)

2.GC可能在不合时宜的时刻被触发(如果CPU在我们游戏的性能关键部分已经满负荷了,那此时即使是少量的GC额外开销也可能导致我们的帧速率下降和性能问题。)

3.堆内存碎片化(当从堆中分配内存时,会根据必须存储的数据大小从不同大小的块中的可用空间中获取内存。当这些内存块返回到堆时,堆可能分成很多由分配块分隔的小空闲块。这意味着虽然可用内存总量可能很高,但由于碎片化太过严重而无法分配一块连续的大内存块。导致GC被触发或不得不扩大堆大小)

       而堆内存碎片化带来的问题:一是游戏内存大小会远高于实际所需要的大小(因为其实实际大小够用,只是因为没有单独一块够分配该变量的内存,所以去申请更多内存),二

### Unity TextMeshPro 中文显示与性能优化 #### 中文显示的支持 TextMeshPro 是 Unity 提供的强大文本渲染工具,能够很好地支持多语言环境下的文字显示,包括中文字符。为了确保中文能够在项目中正常显示,需完成以下操作: - 首先确认已通过 Asset Store 下载并导入了 TextMeshPro 插件[^3]。 - 接着配置字体资源文件。由于默认的英文字体可能不包含完整的 Unicode 字符集,因此需要加载一个支持中文字符的 TTF 或 OTF 文件作为自定义字体。可以通过拖拽方式将该字体附加到 `Font Assets` 的字段上,并重新生成 Font Atlas 来适应新的字形需求[^2]。 ```csharp // 设置自定义字体给TMP_Text组件实例 using TMPro; public class SetChineseFont : MonoBehaviour { public TMP_FontAsset chineseFont; void Start() { GetComponent<TMP_Text>().font = chineseFont; } } ``` 上述代码展示了如何程序化地切换至适配好的中文字体资产。 #### 性能优化策略 针对 UGUI 渲染过程中涉及的 Canvas 批处理机制以及 Layout 计算开销等问题,可以采取如下措施来提升效率[^4]: 1. **减少顶点数量**: 利用 Sprite Atlasing 功能或者手动合并多个静态文本对象成单个 MeshRenderer 实体,从而降低 Draw Calls 数量;另外合理规划字体大小范围也能间接削减几何复杂度。 2. **启用 GPU Instancing**: 如果目标平台硬件允许,则开启此选项有助于进一步压缩每帧绘制指令调用量。 3. **应用 Object Pooling 技术**: 对频繁更新内容但样式一致的文字控件实施回收再利用模式,避免反复创建销毁带来的内存碎片风险及 GC 压力。 4. **调整 Quality Settings 参数**: 根据实际运行设备能力适当调节抗锯齿级别(Anti-Aliasing Level),平衡画质表现同计算负载之间的关系。 5. **预烘焙常用字符串模板**: 将一些固定不变的信息提前转换为图片形式存储下来代替实时渲染流程,比如标题栏、按钮标签等区域。 综上所述,通过对字体资源配置加以改进配合科学合理的架构设计思路,可以在很大程度改善基于 TextMeshPro 构建的应用场景下汉字呈现效果及其整体流畅程度。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值