垃圾回收

是什么?

垃圾回收(Garbage Collection)GC

工作机制

1、Unity 为用户生成的代码和脚本采用了自动内存管理。

2、小块数据(如值类型的局部变量)分配在栈上。大块数据和长期存储分配在托管堆上。

3、垃圾收集器 (GC)会定期识别并释放未使用的堆内存。虽然这是自动运行的,但检查堆中所有对象的过程可能导致游戏卡顿或运行缓慢。

要注意某些不必要的堆分配,这可能会导致 GC 尖峰 :


1、在 C# 中,字符串是引用类型,而不是值类型。减少不必要的字符串创建或操作。如果需要在运行时构建字符串,请使用StringBuilder类。

2、缓存数组引用,不要在循环中分配数组。

3、使用 GameObject.CompareTag 而不是手动将字符串与 GameObject.tag 进行比较
(返回新字符串会产生垃圾)。


4、虽然 yield 不会产生垃圾,但创建新的 WaitForSeconds 对象会。缓存并用 WaitForSeconds 对象,而不要在 yield 行中创建它。

using System.Collections;
using UnityEngine;public class Test : MonoBehaviour
{public WaitForSeconds logic;private void Start(){logic = new WaitForSeconds(3);}IEnumerator Check(){yield return logic;Debug.Log("打印");}
}

5、LINQ 和正则表达式 :它们幕后都会进行装箱,从而产生垃圾。如果性能很重要,请避免使用 LINQ 和正则表达式。

6、如有可能,可以使用 System.GC.Collect
主动触发垃圾收集。

UI优化

1、避免使用过多层级

拆分层级!在层级视图中如果游戏对象不需要嵌套,请简化父子化。较少的层级关系将受益于多线程刷新场景中的变换 (Transform)。复杂层级关系会发生不必要的变换 (Transform) 计算以及更多垃圾收集开销。

2、不勾选Raycast Target

对与不需要Raycast Target的UI,建议将其禁用。这些小的更改可以减少不必要的计算。

美术资源优化

正确导入纹理

纹理会占用大部分内存,因此,导入设置非常重要。通常,请遵循以下指导原则 :

  • 减小 Max Size :使用能生成视觉上可接受的结果的最低设置。这种非破坏性方式,可以快速降低纹理内存。

  • 使用 2 的幂 (POT) :Unity 要求移动端纹理压缩格式 (PVRCT 或 ETC)采用 POT 纹理尺寸。

  • 制作纹理图集 :将多个纹理放置到单个纹理中,可以减少绘制调用和加快渲染速度。使用Unity 精灵图集 或第三方 Texture Packer 可以制作纹理图集。

  • 关闭 Read/Write Enabled 选项 :如果启用,此选项在 CPU 和 GPU 可寻址内存中都会创建副本,纹理会占用双倍内存。大多数情况下,应保持此选项为禁用状态。如果要在运行时生成纹理,请通过 Texture2D.Apply 强制执行,并且传入设置为 true 的 makeNoLongerReadable。

  • 禁用不必要的 Mip Map :对于在屏幕上大小保持不变的纹理(如 2D 精灵和 UI 图形),Mip Map 不是必需的,对于与摄像机的距离会变化的 3D 模型,请保留 Mip Map为启用状态。

检查多边形数量

分辨率越高的模型,需要的内存使用量越大,并且可能占用更长的 GPU 时间。您的背景几何体是否需要五十万个多边形?考虑减少所选 DCC 包中的模型。删除摄像机的视角看不到的多边形。使用纹理和法线贴图而不是高密度网格来实现精细的细节。

优化技术或操作

LOD技术

是什么?

多层次细节(Level Of Detail )

作用

根据相机距离物体的远近来显示不同精度的模型

优点

减少场景中模型绘制的面数,提高渲染的性能

缺点

需要准备多套不同精度的美术资源,同时也增大了游戏体积

对象池技术

是什么?

在开始时初始化若干对象,将它们存到对象池中。需要使用的时候从对象池中取出,使用完后重新放回对象池中。

优点

可以避免频繁创建和销毁对象带来性能消耗。

适用场景

如果需要对某种对象进行频繁创建和销毁时,例如应用在子弹、敌人等

批处理技术 

Unity的批处理(Batching)技术是优化渲染性能的重要手段,它通过减少Draw Call次数来提高渲染效率。

光照烘焙

光照烘焙是Unity中重要的光照优化技术,它通过预计算场景中的光照信息,将结果"烘焙"到光照贴图(Lightmap)中,从而减少实时计算开销。

遮挡剔除

(occlusion culling)

遮挡剔除是Unity中一项重要的渲染优化技术,它通过剔除被其他物体完全遮挡的物体来减少不必要的渲染计算。

限制后期处理效果

全屏幕后期效果处理(如发光)会极大降低性能。请在游戏的美术设计中谨慎使用这些效果。

避免过多使用 Animator

Animator 主要用于人形角色,但也常用于动画化单个值(如 UI 元素的 Alpha 通道)。

避免过多使用Animator,尤其在处理UI动画时。尽可能对移动设备使用旧版 Animation 组件。

考虑创建补间函数或者使用第三方库来实现简单动画(如 DOTween)。

选择正确的帧率

1、移动端项目必须在帧率和电池续航时间以及热节流之间获得平衡。不需要将设备限值推向 60 fps,可以折衷以 30 fps 运行。Unity 默认移动端为 30 fps。

2、也可以通过 Application.targetFrameRate 在运行时动态调整帧率。例如,甚至可以将缓慢或相对静止的场景降至 30 fps 以下,而将玩游戏时的 fps 设置保留为较高值。

代码优化

1、如果确实需要使用 Update,可以考虑每 n 帧运行一次代码。这是一种应用时间切片 (将繁重的工作负载分布到多个帧的常用技术)的方法。在下面的示例中,我们每三帧运行一次 逻辑

private int interval = 3;void Update()
{if (Time.frameCount % interval == 0){//运行逻辑}
}

2、避免空Unity 事件

即使是空的 MonoBehaviour 也需要资源,因此应删除空的 Update 或 LateUpdate 方法。

3、删除调试日志语句Debug.Log

日志语句(尤其是在 Update、LateUpdate 或 FixedUpdate 中)可能会降低性能。在进行构建之前,请禁用日志语句。

4、缓存游戏对象和组件

GameObject.Find、GameObject.GetComponent 和 Camera.main( 在 2020.2之前的版本中)可能开销较大,应避免在 Update 方法中调用它们。而应在 Start 中调用它们,并且缓存相应结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/907133.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/907133.shtml
英文地址,请注明出处:http://en.pswp.cn/news/907133.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python和java差异:关键数据类型与容器

2.0. 对象的类型:可变 (Mutable) 与不可变 (Immutable) 在Python中,理解对象的可变性 (mutability) 是至关重要的,它影响着变量如何被修改、函数参数如何传递以及数据结构的行为。 不可变对象 (Immutable Objects): 大白话定义:…

DAY 33

知识点回顾: 1. PyTorch和cuda的安装 2. 查看显卡信息的命令行命令(cmd中使用) 3. cuda的检查 4. 简单神经网络的流程 a. 数据预处理(归一化、转换成张量) b. 模型的定义 i. 继承nn.Module类 ii. 定义…

Minktec 柔性弯曲传感器,灵敏捕捉坐姿弓背、精准监测行走姿态,守护儿童背部健康,为科学健身提供数据支撑,开启职业健康与背痛 AI 干预新方向。

Minktec弯曲形变传感器通过创新的技术设计,为各种弯曲和形变检测需求提供了精确的解决方案。其核心技术基于薄膜柔性传感器的应用,能够捕捉物体在三维空间中的动态变化。传感器内部结合了多点排列的应变元件和专有算法,实现了形状的实时重建。…

快递鸟接口费用解析:中小电商成本控制方案

中小电商企业在物流环节的成本控制,直接影响着整体运营效率和利润空间。作为国内主流的物流数据服务商,快递鸟API接口凭借其聚合查询、电子面单、轨迹跟踪等功能,成为众多电商企业的选择。但如何精准解析其收费模式,并制定科学的成…

maven 最短路径依赖优先

问题描述: 项目在升级大版本后出现了,两个不同模块所引用的同一个依赖包版本不同 module A 引用了 module B,module B 引用了 A_1.0.jar->B_1.0.jar->C_1.0.jar(C 为B 里面的包) 在执行 mvn dependency:tree 后发现: modul…

游戏引擎学习第314天:将精灵拆分成多个层

回顾并为今天的工作做准备 我们今天继续昨天开始的工作,现在我们要回到渲染中处理 Z 值的最终环节。我们目前已经有一个我们认为还算合理的排序方式,虽然可能还需要在接下来的过程中进行一些调整,但总体上已经有了一个明确的方向。 我们已经…

HashSet的基本概念

ashSet的基本概念 - HashSet 是C#中用于存储唯一元素的泛型集合类,它基于哈希表实现,具有快速查找、添加和删除元素的特性。 - 核心特点: - 不允许存储重复元素 - 元素无序排列 - 查找、添加、删除操作的平均时间复杂度为O(1) - 实现了 IEnum…

信号与系统10-综合案例:智能信号处理系统

第7课:综合案例——智能信号处理系统 1. 案例1:基于傅里叶变换与AI的语音信号分类系统 1.1 理论基础 傅里叶变换是信号处理的核心工具之一,能够将时域信号转换为频域表示(如频谱图)。语音信号的频域特征&#xff08…

详解Kubernetes Scheduler 的调度策略

详解Kubernetes Scheduler 的调度策略 在 Kubernetes(K8s)中,Scheduler(调度器) 负责 决定 Pod 应该运行在哪个 Node(节点)。 👉 调度器的目标是什么? ✅ 最大化资源利用率(让 CPU、内存等资源不浪费) ✅ 保证 Pod 运行在合适的 Node 上(避免超载、满足亲和性)…

在 ElementUI 中实现 Table 单元格合并

在 ElementUI 中实现 Table 单元格合并 在使用 ElementUI 的 Table 组件时,有时我们需要合并相邻的单元格,以提高表格的可读性和简洁性。下面是一个关于如何在 Table 中根据特定字段合并单元格的实现方法。 逻辑分析 spanMethod 方法:这是 …

小土堆pytorch--现有网络模型的使用及修改

现有网络模型的使用及修改 一级目录二级目录三级目录 现有网络模型的使用及修改1.VGG16模型VGG16网络模型简介**核心特点****网络结构细节****优缺点与应用****变种与后续发展** 2. 使用vgg16模型 一级目录 二级目录 三级目录 现有网络模型的使用及修改 1.VGG16模型 VGG16…

Oracle 正则表达式匹配(Oracle 11g)

1、连续2词汉字重复或3词汉字重复(不会忽略符号) ([^ \u4e00-\u9fa5\S]{2,3})\1 例如:阿富、 SELECT REGEXP_replace(阿富、阿富、 阿富汗、 , ([^ \u4e00-\u9fa5\S]{2,3})\1, 重复) FROM dual结果: 2、连续2词汉字重复或3词…

对话魔数智擎CEO柴磊:昇腾AI赋能,大小模型融合开启金融风控新范式

导读:#昇腾逐梦人# AI已经成为金融机构核心竞争力的关键要素。专注AI金融赛道的魔数智擎,通过大小模型融合,让AI成为银行的“金融风控专家”。 作者 | 小葳 图片来源 | 摄图 在AI涌向产业的时代赛跑中,开发者是绝对的主角。 昇腾…

IDEA使用Git进行commit提交到本地git空间后撤回到commit版本之前

一、前言 Git作为最流行和最全面的版本控制工具,非常好用,但是操作也会比SVN复杂一些。毕竟有得有失嘛,所以我选择Git,最近在工作中,一不小心吧一些无关紧要的文件commit了。还好在Push之前看到,不过就算P…

GitHub 趋势日报 (2025年05月26日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1Fosowl/agenticSeek完全本地的马努斯AI。没有API,没有200美元的每…

Matlab实现LSTM-SVM时间序列预测,作者:机器学习之心

Matlab实现LSTM-SVM时间序列预测,作者:机器学习之心 目录 Matlab实现LSTM-SVM时间序列预测,作者:机器学习之心效果一览基本介绍程序设计参考资料 效果一览 基本介绍 该代码实现了一个结合LSTM和SVM的混合模型,用于时间…

深入解析Spring Boot与Redis集成:高效缓存与性能优化实践

深入解析Spring Boot与Redis集成:高效缓存与性能优化实践 引言 在现代Web应用开发中,缓存技术是提升系统性能的重要手段之一。Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列等场景。本文将深入探讨如何在Spring Boot项目中集成…

Jmeter一些元件使用的详细记录

1、csv数据文件处理 文件放在bin目录下,属于相对路径读取文件,如果使用绝对路径则需要改为l添加盘符的路径,如:D:/apach/jmeter/bin 说明: 当选择False时,如果请求的次数 大于 文件中的有效数据行数&…

使用 Cursor 从 0 到 1 开发一个全栈 chatbox 项目

大家好,我是 luckySnail,你肯定用过 AI 聊天工具。例如: Gemini,ChatGPT,claude AI 等产品,我们通过它们的 web 网站或者手机应用提出问题,得到答案。在之前如果你想要构建一个这样的 AI 聊天应…

嵌入式学习的第二十六天-系统编程-文件IO+目录

一、文件IO相关函数 1.read/write cp #include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> #include <stdio.h> #include<unistd.h> #include<string.h>int main(int argc, char **argv) {if(argc<3){fprintf(stderr, …