【unity进阶知识4】封装unity协程工具,避免 GC(垃圾回收)
文章目录
- 前言
- 封装协程工具类,避免 GC(垃圾回收)
- 使用
- 1.使用默认方式使用协程
- 2.使用自定义的 CoroutineTool 工具类来等待不同的时间
- 完结
前言
在 Unity 中,使用 yield return null 、yield return new WaitForEndOfFrame()等会导致 GC(垃圾回收)开销。
-
yield return null: 每次调用这个语句,Unity 会创建一个新的迭代器状态机。当你执行协程时,如果你在协程中使用 yield return null,它会生成一个新的迭代器,这样会产生额外的内存分配。
-
new WaitForEndOfFrame(): 每次使用 new WaitForEndOfFrame() 都会创建一个新的 WaitForEndOfFrame 对象。这种频繁的对象创建会增加内存开销,并可能导致 GC 的触发。
但是注意,启动协程时会创建一个 Coroutine 对象,这本身会导致一次内存分配,进而可能引发垃圾回收(GC)。这是协程在 Unity 中的一个固有特性,无法完全避免。但是它还是解决了协程的主要痛点,毕竟一个项目启动的协程一般不会很多。如果你在意,可以选择使用 UniTask:
【推荐100个unity插件之33】比 Unity 自带协程更高效的异步处理方式,提供一个高性能和0GC的async/await异步方案——UniTask插件
封装协程工具类,避免 GC(垃圾回收)
提前new好协程所需要的WaitForEndOfFrame、WaitForFixedUpdate、WaitForFrameStruct类的对象,避免GC。
/// <summary>
/// 协程工具类,避免 GC(垃圾回收)
/// </summary>
public static class CoroutineTool
{// 定义一个结构体,用于表示等待一帧的状态private struct WaitForFrameStruct : IEnumerator{public object Current => null;public bool MoveNext() { return false; } // 一旦调用,立即返回 false,停止迭代public void Reset() { } // 重置方法,不做任何操作}// 预定义的等待结束帧对象,避免多次创建private static WaitForEndOfFrame waitForEndOfFrame = new WaitForEndOfFrame();// 预定义的等待固定更新对象,避免多次创建private static WaitForFixedUpdate waitForFixedUpdate = new WaitForFixedUpdate();/// <summary>/// 获取等待结束帧的对象/// </summary>public static WaitForEndOfFrame WaitForEndOfFrame(){return waitForEndOfFrame;}/// <summary>/// 获取等待固定更新的对象/// </summary>public static WaitForFixedUpdate WaitForFixedUpdate(){return waitForFixedUpdate;}/// <summary>/// 等待指定时间(以秒为单位)/// </summary>/// <param name="time">等待的时间</param>public static IEnumerator WaitForSeconds(float time){float currTime = 0;while (currTime < time){currTime += Time.deltaTime;yield return new WaitForFrameStruct(); // 等待一帧}}/// <summary>/// 等待指定的实时时间(不受时间缩放影响)/// </summary>/// <param name="time">等待的时间</param>public static IEnumerator WaitForSecondsRealtime(float time){float currTime = 0; // 当前经过的时间while (currTime < time) // 当经过的时间小于指定时间时{currTime += Time.unscaledDeltaTime; // 增加经过的时间(不受时间缩放影响)yield return new WaitForFrameStruct(); // 等待一帧}}/// <summary>/// 等待指定帧数/// </summary>/// <param name="count">等待的帧数,默认为1</param>public static IEnumerator WaitForFrame(int count = 1){for (int i = 0; i < count; i++){yield return new WaitForFrameStruct(); // 等待一帧}}
}
使用
1.使用默认方式使用协程
IEnumerator DelayedAction()
{yield return new WaitForEndOfFrame();// 等待到当前帧的结束(即所有渲染操作完成后)yield return new WaitForFixedUpdate();// 等待到下一个固定更新(适用于物理计算)yield return new WaitForSeconds(2.0f); // 等待2秒(游戏时间)yield return new WaitForSecondsRealtime(2.0f);// 等待2秒(现实时间,不受游戏时间缩放影响)yield return null;// 等待一帧
}
2.使用自定义的 CoroutineTool 工具类来等待不同的时间
IEnumerator DelayedAction()
{yield return CoroutineTool.WaitForEndOfFrame(); // 等待到当前帧的结束yield return CoroutineTool.WaitForFixedUpdate(); // 等待到下一个固定更新yield return CoroutineTool.WaitForSeconds(2.0f); // 等待2秒(游戏时间)yield return CoroutineTool.WaitForSecondsRealtime(2.0f); // 等待2秒(现实时间,不受游戏时间缩放影响)yield return CoroutineTool.WaitForFrame(); // 等待一帧yield return CoroutineTool.WaitForFrame(3); // 等待3帧
}
完结
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!
好了,我是向宇,https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

相关文章:
【unity进阶知识4】封装unity协程工具,避免 GC(垃圾回收)
文章目录 前言封装协程工具类,避免 GC(垃圾回收)使用1.使用默认方式使用协程2.使用自定义的 CoroutineTool 工具类来等待不同的时间 完结 前言 在 Unity 中,使用 yield return null 、yield return new WaitForEndOfFrame()等会导…...
Source insight安装使用笔记
Source insight安装使用笔记 1.安装包下载2.安装记录3. 使用教程1.安装包下载 官网下载 可修改 C:\ProgramData\Source Insight\4.0\si4.lic 将Expiration=”2017-XX-XX”中的2017修改为2030。 本地下载 2.安装记录...
golang学习笔记29——golang 中如何将 GitHub 最新提交的版本设置为 v1.0.0
推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...
Netty源码解析-锁机制
Netty基本介绍,参考 Netty与网络编程 为了提高性能,Netty对锁也做了大量优化 1、锁优化技术 Netty大量使用了锁优化技术: 1.1 减小锁粒度1.2 减少锁对象的空间占用1.3 提高锁的性能1.4 根据不同业务场景选择合适锁1.5 能不用锁则不用锁 …...
【C/C++】initializer_list
initializer_list 1 构造函数场景 class P { public:P(int a, int b) {std::cout << "int, int" << std::endl;}P(std::initializer_list<int> initList) {std::cout << "initializer_list" << std::endl;} };调用&#x…...
不要再混淆啦!一文带你学会原型链继承、构造函数继承、寄生组合继承、ES6继承
JS继承目录 一、原型链继承2、构造函数继承3、组合继承4、寄生组合继承5、ES6继承 js有几种经典的继承方式。比如 原型链继承、 构造函数继承、 组合继承、 寄生组合继承、 ES6继承。让我们一一分析并实现。同时了解每种方案的优缺点。 其实js的继承本质上是通过原型链机制…...
828华为云征文|华为云Flexus X实例Windows Server 2019安装护卫神防火墙——为企业运维安全发挥重要作用!!!
前言 公司最近需要选购一台华为云Windows服务器部署产品应用,但是考虑到Windows的安全性至关重要。护卫神防火墙无疑是守护Windows系统安全的得力助手。 华为云以其强大的性能和稳定的服务,为众多企业和开发者提供了可靠的云端基础设施。在网络环境日益复…...
最新的iOS 18版本和Android 15版本系统分别升级了哪些功能?
iOS 18 推出了多项激动人心的新功能和改进。以下是一些亮点: 日记应用:一款全新的日记应用,旨在帮助用户记录日常经历、想法和活动,利用设备内置智能功能建议主题,并根据照片、位置和其他数据组织条目。 眼动追踪导航…...
window系统DockerDesktop 部署windows容器
目录 参考文献1、安装Docker Desktop1.1 下载安装包1.2 安装教程1.3 异常解决 2、安装windows容器2.1 先启动DockerDesktop 软件界面2.2 检查docker版本2.3 拉取windows镜像2.4 网盘下载windows镜像 参考文献 windows容器docker中文官网 Docker: windows下跑windows镜像 1、安…...
CSDN文章导出md并迁移至博客园
一、获取所有文章地址 1.进csdn首页,点击自己的头像 2.在个人主页界面,按F12打开控制台,并找到network,找到get-business开头的请求,右键copy他的url 3.选择console,输入一下代码,其中fetch里面的url是你刚…...
计算机组成原理(笔记5原码和补码的乘法以及直接补码阵列乘法器 )
原码一位乘法 手算:过程 令x′|x|0.x1x2…xn-1xn,y′|y|0.y1y2…yn-1yn 同时令乘积P′ |P| x′ y′,有: x′ y′ x′(0.y1y2…yn-1yn) x′ (y12-1y22-2…yn-12-(n-1)yn2-n) 2-1(y1x′2-1(y2x′…2-1(yn-1x′2-1(ynx′0))…))…...
【hot100-java】【括号生成】
R9-回溯篇 枚举填左括号 class Solution {private int n;private char[] path;private final List<String> retnew ArrayList<>();public List<String> generateParenthesis(int n) {this.nn;//所有括号长度都是n*2pathnew char [n*2];dfs(0,0);return ret;…...
k8s_资源管理介绍
资源管理介绍 在k8s中,所有内容都抽象成资源,用户需要通过操作资源来管理k8s k8s本身就是一个集群系统,用户可以在集群中部署服务,在k8s集群中运行一个个的容器,将指定的程序部署到容器中 k8s最小的管理单元是pod&…...
操作简单 地检编码器 武汉正向科技售后优质
武汉正向科技的地检编码器以导轨式安装方式,方便拆卸,立体结构造型,节约空间。 格雷母线定位系统由格雷母线,天线箱,解码器,编码器等部件构成。 用途 地上检测方式地址信号的编码、功率放大,与…...
2024中国新能源汽车零部件交易会,开源网安展示了什么?
近日,2024中国新能源汽车零部件交易会在十堰国际会展中心举行。开源网安车联网安全实验室携车联网安全相关产品及解决方案亮相本次交易会,保障智能网联汽车“车、路、云、网、图、边”安全,推动智能网联汽车技术突破与产业化发展。 中国新能源…...
Java解析嵌套jar中class文件
一、简述 Maven项目通过package打成jar包后,jar包中包含所有依赖lib文件。本文介绍了两种方式解析嵌套jar中的class文件,一种是通过spring-boot-loader包JarFileArchive,另一种是util包中JarFile。 二、JarFileArchive方式 1.spring-boot-…...
【含文档】基于Springboot+Vue的高校竞赛管理系统(含源码+数据库+lw)
1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 系统定义了三个…...
在大模型应用层面区分对比检索增强生成RAG技术和知识库技术
在前文: 《RAG(Retrieval-Augmented Generation)检索增强生成技术基础了解学习与实践》 初步了解实践了RAG技术,后面好多朋友也在沟通聊到了前面大模型另一项技术就是本地知识库方法,之前基于LangChain本地知识库的方式,可以本地…...
云和恩墨携手华为,发布zCloud数据库备份管理一体机并宣布共建数据保护生态...
为期三天的第九届华为全联接大会(HUAWEI CONNECT 2024)于9月19日在上海世博中心&展览馆盛大召开。20日下午,一场围绕“全场景数据保护,护航数智化时代”的专题论坛举办,云和恩墨受邀参加,并期待与华为合…...
Linux系统备份Gitee等云git所有仓库与所有分支的数字资产
思路: 1. ssh 配置 2. reps.txt 列出所有仓库名 3. exp的自动化备份脚本 -- 环境安装: exp需要依赖安装的文件,所以先执行下(以ubuntu为例): sudo apt-get install expect 操作步骤: ssh 配置 1. 添加公钥至 …...
Python try...except ImportError 语句详解
在Python编程中,ImportError 是与模块导入相关的核心异常。优雅地处理它,是编写健壮、可维护和跨平台代码的关键。try...except ImportError 结构正是实现这一目标的标准工具。本文将为你抽丝剥茧,从基础概念到高级实践,全面解析这…...
颠覆性创新:为什么Upkie开源轮式双足机器人正在重新定义机器人开发范式
颠覆性创新:为什么Upkie开源轮式双足机器人正在重新定义机器人开发范式 【免费下载链接】upkie Open-source wheeled biped robots 项目地址: https://gitcode.com/gh_mirrors/up/upkie 在传统机器人设计面临轮式与足式两难选择的今天,一个革命性…...
柔性LED灯丝DIY:从电路原理到创意饰品制作全攻略
1. 项目概述:当生日遇上柔性LED灯丝给孩子的生日派对准备一份独一无二的、会发光的惊喜,是很多家长和手工爱好者的心愿。这次,我们不买现成的塑料灯牌,而是亲手做一个能戴在头上或挂在脖子上的“生日数字灯冠”。这个项目的核心&a…...
解锁你的音乐宝藏:ncmdump让网易云音乐文件自由播放
解锁你的音乐宝藏:ncmdump让网易云音乐文件自由播放 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 当你精心收藏的网易云音乐只能在特定客户端播放时,那种被束缚的感觉是否让你感到无奈?想象一下…...
深度解析Scarab:空洞骑士模组管理器的专业实现与架构设计
深度解析Scarab:空洞骑士模组管理器的专业实现与架构设计 【免费下载链接】Scarab An installer for Hollow Knight mods written with Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 空洞骑士模组管理器Scarab为玩家提供了高效、专业的模组…...
开源虚拟世界引擎Vircadia核心架构与部署实战指南
1. 项目概述:一个开源虚拟世界的核心引擎如果你对构建一个属于自己的、去中心化的虚拟世界感兴趣,那么你很可能已经听说过或者正在寻找一个合适的底层引擎。今天要聊的这个项目,就是这样一个领域的重量级选手:vircadia/vircadia-n…...
10分钟掌握Autovisor:智慧树网课自动化学习的完整解决方案
10分钟掌握Autovisor:智慧树网课自动化学习的完整解决方案 【免费下载链接】Autovisor 2025智慧树刷课脚本 基于Python Playwright的自动化程序 [有免安装版] 项目地址: https://gitcode.com/gh_mirrors/au/Autovisor 还在为繁重的智慧树网课任务而烦恼吗&am…...
终极指南:如何在Mac上免费快速导出微信聊天记录
终极指南:如何在Mac上免费快速导出微信聊天记录 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因误删重要微信聊天记录而焦虑?或需要查找…...
Copaw_dev:AI编程助手增强框架,提升代码生成与自动化开发效率
1. 项目概述:Copaw_dev 是什么,以及它为何值得关注如果你是一名开发者,尤其是对自动化、代码生成或者AI辅助编程感兴趣,那么“Copaw_dev”这个项目标题很可能已经引起了你的注意。乍一看,这个由“G-Divine”维护的项目…...
Arm Iris调试接口:架构设计与工程实践详解
1. Iris调试与追踪接口深度解析调试与追踪技术是嵌入式系统开发的核心支柱,而Arm的Iris接口代表了这一领域的最新进展。作为一名长期从事嵌入式调试工具开发的工程师,我将带您深入剖析这套接口的设计哲学与实战应用。1.1 接口架构设计理念Iris的架构设计…...
