GameFrameWork框架学习——Base——其二
GameFrameworkModule.cs总共就这点东西首先它是一个抽象类自己默认实现的是Priority默认就给它0可以被覆写为其他的但是不写就是0。然后Update和Shutdown留给实现类GameFrameworkModule只作为一个父类来用大部分时候都用于里氏替换配合GameEntry。GameFrameworkLinkedList.cs重点来了。GF就是用LinkedList这种模式来工作的因为需要某一个模块时候这个模块只需要知道自己的上一个和下一个是谁就行了直接存着下一节点的地址而且遍历也是一个一个遍历所以对于遍历也很方便。不用List首先是因为List也需要扩容而链表就不用了它地址不是连续的而且对于加减某一个节点非常方便也不需要List那样内存搬家的操作。首先它是一个sealed密封类防止被继承修改。然后指定泛型T也就是指定T为什么类型它内部维护的的LinkedList中的每一个节点就的值的类型就是什么。它集成ICollection, IEnumerable, ICollection, IEnumerable首先因为需要让它能被foreach所以肯定得能从它身上获得到迭代器所以继承IEnumerable但是它是一个类如果迭代器是class那么每foreach一次就会实例化一个继承了IEnumerator的子类那么每一帧都遍历一次的话就会在堆上创建很多仅仅是因为遍历就占用堆内存的实例所以这里没有让GameFrameworkLinkedList这个类作为迭代器的实现类只是让它能够获取到一个迭代器。然后继承ICollection如果框架内部或外部引用了某些接收 ICollection 参数的旧方法实现了这个接口后GameFrameworkLinkedList 就可以直接传入无需额外封装成数组或 List另外Unity在Inspector上如果用ICollection来约束的话也可以传入当前类型。m_LinkedList是GameFrameworkLinkedList这个类主要封装的一个链表里面放了所有正在使用的节点每一个Node的Value的类型是创建GameFrameworkLinkedList模块时T传入的类型。m_CachedNodes是一个Node的缓存池意思就是当Node不需要的时候放入这个缓存池里需要的时候再从这个缓存池里取取出来在对参数进行设置直接减少Node的创建数量如果频繁创建销毁节点因为是Class那么开销很大但是用池技术的话就可以大幅度减少在堆上的开销避免GC造成的卡顿。首先继承ICollection需要实现这里这个SyncRoot相当于将m_LinkedList自身返回出去了当做线程锁对象来用但是不建议用是ICollection接口要求。然后IsSynchronized返回当前m_LinkedList是否是线程安全的IsSynchronized 永远返回 false。结论是不要用这两个。获取迭代器实例调用了下面这个方法返回的就是创建出来的Enumerator这个对象(它是struct不是class后面说)IEnumerable.GetEnumerator是因为ICollection也继承了IEnumerable但是ICollection是接口没有具体实现所以需要实现ICollection里的GetEnumerator方法然后第二个GetEnumerator()方法是一个内部具体处理的方法让这些接口必须实现的方法来调用。然后继承ICollection需要实现定义怎么往集合里添加元素。定义怎么清理集合的元素。定义怎么比较集合的元素。定义获取迭代器让其能够被foreach。定义怎么移除某个元素。定义怎么将下标后的内容拷贝到对应泛型的array里。然后就是剩下的IEnumerable和IEnumerable这两个接口了对应的函数了:只有获取迭代器方法他们内部都调用的是GetEnumerator这个方法这个在上面已经看过了里面就是new了一个Enumerator。说完了接口强制要求实现的函数再看看这个类里其他的函数或者属性返回缓存节点队列的数量返回第一个节点返回最后一个节点。先看两个比较重要的方法AcquireNode和ReleaseNodeAcquireNode是创建节点创建节点如果发现缓存节点队列不是空的那么就直接从缓存节点队列取一个然后初始化设置value再返回出去。如果缓存节点队列是空的那么直接new一个节点给到node然后返回。然后是这个ReleaseNode就是将传递进来的节点的Value设置成默认值然后加到缓存节点队列里等后续用。直接减少节点创建数量。然后就没有其他函数了之后就是包含在GameFrameworkLinkedList里的一个内部结构体Enumerator。继承IEnumerator,IEnumerator也就是说在之前的GetEnumerator的时候返回的对象就是这个结构体对象。首先制作一个迭代器要实现迭代器 对于某个集合的引用。比如这里让迭代器引用的集合类型就是LinkedList.Enumerator也就是直接引用了一个Enumerator对象(或者说直接将具体的迭代器封装了一下因为C#内置的LinkedList.Enumerator在获取迭代器时候也是通过struct制作的)作为要遍历的引用的对象。然后构造函数就是将LinkedList的那个对象传递进来然后从这个LinkedList上获得struct类型的迭代器给到自身等着遍历用。首先得实现这两个接口对应的Current属性其实具体实现就是从LinkedList这个struct对象里再获取Current。然后是这个释放依旧是调用引用对象的。最后是MoveNext和Reset不过Reset函数需要注意m_Enumerator的类型是LinkedList.Enumerator需要强转成IEnumerator这当然可以转换因为LinkedList内部的Enumerator也继承了IEnumerator。所以这个GF框架的GameFrameworkLinkedList相当于仿照LinkedList来制作并且内部包装维护了一个LinkedList对象然后加上了一些自己需要的内容比如CacheNode什么什么的这些重新封装了一遍LinkedList减少节点的创建。另外这里需要说一下因为结构体的成员在内存中的排列是按照声明的时候的顺序的比如一个byte一个int一个byte总共三个变量如果不声明Auto那么它们在内存中的所占用的内存空间就是12个字节因为在32/64位系统上int要求4字节对齐也就是比如下标0给到第一个byte成员然后填充三个字节保持字节对齐然后再写int的那四个字节然后再写byte然后再填充三个字节这样最终就有6个字节用来做了填充。如果加了Auto的话允许运行时候重新排列字段顺序减少填充空隙。比如会变成前四个字节直接给到int然后下一个字节给byte成员再下一个字节给byte成员然后再填充两个字节保持4字节的对齐总共占用8字节。缺点就是排序有可能不确定如果存在和其他语言交互必须使用[StructLayout(LayoutKind.Sequential)]其实不加的话也是这个特性所以这种感觉不建议使用。如果只考虑在托管代码内部使用并且高频创建的这种结构体就可以使用。还有一种手动设置偏移量的方式关于需要多次作为临时使用的对象看看能不能用结构体比如这里的IEnumerator对象遍历完就不用了如果是类对象那么就浪费了一个堆空间的位置所以适合用栈。另外StructLayout重排对临时不需要其他语言互相操作的结构体可以用否则别用。面相接口编程比如这个LinkedList类它的大部分函数都是接口要求的比如SyncRoot这个属性其实不建议使用但是接口要求了写上也无妨。GameFrameworkAction.cs这个脚本里面都是无返回值的委托专门设定的有不同参数的委托而且通过in来修饰泛型让对应类型只能成为参数。大概瞄一眼。GameFrameworkFunc.cs和GameFrameworkAction.cs一样是有返回值的委托。GameFrameworkException.cs一个抛出类可以在try catch时候判断是否是这个类型的抛出。直接继承Exception。构造函数直接base了父类Exception的构造函数目的只是封装一层用来在try catch时候判断是否有抛出和抛出的类型是否是GameFrameworkException因为如果判断到是GameFrameworkException类型的错误的话就很方便能明白是逻辑和框架部分的问题了。就像看到Unity里OutOfRange一眼就能明白抛出了个溢出的意思一样而且对于try catch里针对某些抛出也可以继续执行后面finally的内容。先到这儿感觉这个系列要变得很庞大起来了…若有问题感谢指出

相关新闻

高德问店AI选址:数据智能驱动实体商业决策创新

高德问店AI选址:数据智能驱动实体商业决策创新

阿里最新推出的"高德问店"AI服务,为实体创业者提供了一套基于位置智能的选址决策解决方案。这个服务整合了高德地图的地理位置数据、钉钉悟空的商业洞察能力以及阿里云的技术支持,旨在帮助创业者在开店前做出更精准的选址判断。对于实体创业者…

2026/10/15 13:41:24 阅读更多 →
AI程序员规模化实践:Codex智能体架构与开发效能分析

AI程序员规模化实践:Codex智能体架构与开发效能分析

1. 项目背景:当人类遇上AI程序员去年夏天,硅谷爆出个让所有技术团队都坐不住的消息:某创业公司用3个工程师带着100个AI程序员,一个月烧掉130万美元研发经费。更惊人的是,OpenAI直接表态:"这钱我出&quo…

2026/10/15 13:41:36 阅读更多 →
I2C总线时钟同步与仲裁机制深度解析:从原理到嵌入式实践

I2C总线时钟同步与仲裁机制深度解析:从原理到嵌入式实践

1. I2C总线:从两根线开始的嵌入式通信艺术如果你玩过单片机或者嵌入式开发,I2C总线绝对是你绕不开的一个老朋友。它简单到只需要两根线——一根数据线(SDA),一根时钟线(SCL),就能把一…

2026/10/15 14:04:21 阅读更多 →

最新新闻

从AI生成到实体印刷:artcraft工作流让文创落地不再难

从AI生成到实体印刷:artcraft工作流让文创落地不再难

如果你是那种喜欢用 AI 生成图片,但又不想让成果只停留在屏幕里的人,artcraft 这个名字你应该会喜欢。说白了,它把“AI 生成”和“手作 / 小批量印刷”这两件原本很割裂的事,硬生生捏成了一条能跑通的流水线。这年头,类…

2026/10/17 8:05:16 阅读更多 →
JDK 1.8u45 安装与校验:遗留系统兼容性实战指南

JDK 1.8u45 安装与校验:遗留系统兼容性实战指南

简介:本资源为Oracle官方发布的JDK 1.8.0_45 64位Linux平台标准开发套件(jdk-8u45-linux-x64.tar.gz),专为Linux环境下Java中高级开发者、运维工程师及教学实验人员设计,用于搭建稳定、合规的Java 8开发与运行环境。压…

2026/10/17 8:05:16 阅读更多 →
Flutter入门状态管理实战:StatefulWidget + setState 从交互到异步

Flutter入门状态管理实战:StatefulWidget + setState 从交互到异步

1. 为什么第三篇才敢聊状态管理前两篇我们搞定了环境搭建、Dart 语法扫盲、Widget 基础概念和第一个静态页面,当时还兴冲冲地写了个只有文字和图片的界面,运行起来那一刻确实挺爽。但爽完之后会发现一个问题:这个页面是死的。点击按钮没反应&…

2026/10/17 8:05:16 阅读更多 →
分类算法与关联规则挖掘:从原理到实战的完整指南

分类算法与关联规则挖掘:从原理到实战的完整指南

分类算法与关联规则挖掘这组主题,算是数据挖掘里最经典的一对搭档。一个负责预测——拿到一条数据判断它属于哪个类别;一个负责发现——从大量记录中找出频繁出现的组合模式。两者覆盖了从监督学习到无监督挖掘的核心思路,无论做推荐系统、风…

2026/10/17 8:05:16 阅读更多 →
AI辅助毕业论文全流程指南:从选题、文献综述到降重答辩的工具选择与实操方法

AI辅助毕业论文全流程指南:从选题、文献综述到降重答辩的工具选择与实操方法

毕业论文这东西,几乎每个本科生和研究生都要啃一遍。过去两年,AI论文写作软件已经从“能不能用”进化到了“怎么用得优雅”:能理解学术语境、能生成参考文献条目、能按模板排版,甚至能帮你对着导师的意见逐条修改。我帮不少师弟师…

2026/10/17 8:05:16 阅读更多 →
改进型永磁同步电机DTC仿真模型:滞环与SVPWM转矩脉动抑制对比

改进型永磁同步电机DTC仿真模型:滞环与SVPWM转矩脉动抑制对比

简介:一套面向电机控制研究人员与电气工程专业学生的永磁同步电机(PMSM)直接转矩控制(DTC)改进版Simulink仿真模型,涵盖从电机本体、转矩磁链估算到滞环控制器与逆变器开关逻辑的完整闭环结构。压缩包共包含…

2026/10/17 8:04:16 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →