GameFrameWork框架学习——Base——TaskPool

发布时间:2026/10/30 4:56:07

GameFrameWork框架学习——Base——TaskPool 在看Resources模块之前因为它依赖TaskPool所以先看一下TaskPool模块。TaskStatus任务的执行状态未开始进行中执行结束。继承了byte可以将当前结构体对象进行位运算。TaskInfo这是一个任务信息类用来查看当前Task的执行状态因为用来查看所以用struct。m_IsValid任务是否有效。m_SerialId任务的序列编号也就是Task对应的ID。m_Tag任务的标签。m_Priority任务的优先级。m_UserData任务的自定义数据。m_Status任务的执行状态。m_Description任务描述的文本。之后就是围绕这些参数的属性。StartTaskStatus开始处理任务的标志比如执行一个Task时候瞬间完成了(或者说同步完成了)那么获取StartTaskStatus就是Done如果这个Task被排队了那么获得的就是HasToWait。TaskBase首先它是一个作为Task任务的抽象基类继承IReference也就是被引用池管理着。DefaultPriority是一个默认的优先级数用来给新创建的TaskBase子类对象赋值。m_SerialId是当前TaskBase的唯一序列码。m_Tag是当前Task的标签Tag有时候可以根据Task的标签来拿拥有同一个tag的任务。m_Priority是Task的优先级添加一个任务时会将优先级高的排在前面执行。m_UserData是获取任务的用户自定义数据。这些是对应的属性。然后Description是设置的任务描述。Initialize是初始化TaskBase任务传入序列号标签优先级用户自定义数据。Clear是将使用的信息都设置为默认或者清空。ITaskAgent它是负责处理一个TaskBase的子类任务的内部维护一个Task属性类型是继承了TaskBase的。内部Initialize用来初始化代理。Update用来通过任务代理执行任务。ShutDown关闭代理。Start开始用代理跑任务TaskBase。返回的内容是跑这个任务的结果是直接结束还是排队等待。Reset停止正在处理的TaskBase任务并且重置任务。TaskPool任务池模块用于加入新任务TaskBase通过Agent任务代理来执行任务。首先要求引用池里的任务类型必须是继承了TaskBase的。m_FreeAgents用栈存储所有没有在运行的代理。m_WorkingAgents用GF框架内的链表存储所有正在运行的代理而且因为是链表它是有序并且知道下一个上一个和头尾的。m_WaitingTasks用GF框架的链表存储了所有正在等待执行的继承了BaseTask的任务它们在添加新的任务时候会根据优先级排序由大到小。m_Paused是否TaskPool被暂停。属性包括是否暂停获取Agent总数量获取未在执行的Agent的总数量获取工作中的Agent的数量获取等待中的任务的数量。Update是任务池轮询执行只要没有暂停就执行ProcessRunningTasks处理运行中的Task和ProcessWaitingTasks处理等待中的Task。Shutdown是关闭任务池先将所有任务移除之后如果未在使用的Agent大于0就执行弹出并且关闭这个Agent。处理正在运行的任务Task。先拿到正在工作的Agent的第一个节点然后进入循环先取到这个节点的Task如果取到的节点的Task没有结束那么就执行这个Agent的Update然后将当前节点设置为下一个节点然后结束本次循环直到出现从节点里取到的task的Done为true也就是完成了那么取出当前节点的下一个节点留着然后把当前节点的Agent执行Reset并且压入非正在执行的Agent的链表中然后从正在工作的Agent的链表中移除然后通过引用池回收内部的task最后将刚刚取出的下一个节点设置为当前节点。所以它做了什么?遍历所有节点如果当前遍历的节点没结束就执行对应节点内的Agent的Update然后遍历下一个节点如果结束了就把当前这个节点Agent复位然后压进FreeAgent从WorkingAgents拉出然后让引用池回收最后让当前节点的下一个节点替换自己完成遍历更迭。处理等待中的Tasks。将等待中的Tasks链表节点取出来第一个从头开始循环只要取出来这个不为空并且剩余空闲Agent的个数大于0那么就能继续循环只要没有空闲Agent或者current遍历完了就退出循环。先从空闲Agent里取出一个加到工作中Agent最后.然后取出等待中Task的第一个的current的值(也就是存储的task)。然后把current的下一个等待中Task节点取出来给到next之后用。执行刚刚加入到工作中agent的开始传入task得到运行后的状态。如果状态是完成或者排队或者未知错误说明这个agent的工作结束了就把agent重置压回空闲Agent栈先后从工作中的Agent里移除掉。再判断如果状态是完成或者可以继续处理此任务或者未知错误那么就把current当前这个Task从等待Task链表中移除。再判断状态如果是完成或者状态是未知错误就通过引用池将task对象回收。然后使current等于刚刚存储的current.next遍历下一个等待中Tasks链表的节点。HasToWait 之后 current 依然前进到 next——这避免了死循环。所以它做了什么先从 m_WaitingTasks 取一个节点从这个节点开始遍历。然后如果能取到这个节点并且有空闲Agent才能遍历否则无法通过agent安排任务。然后从空闲agent里弹出一个加到工作agents里之后取到当前遍历的task这个时候存一下下一个task的引用通过刚刚获得的这个工作agent来start取出的task。此时通过agent执行task后如果返回结果是Done或者UnKnownError说明直接就把task执行完了那么就把agent给重置了把刚刚使用的agent还给空闲agents并且将这个agent从工作中agent移除然后把这个task从等待中task移除然后把task通过引用池给释放了。如果返回是HasToWait那么把agent给重置了把刚刚使用的agent还给空闲agents并且将这个agent从工作中agent移除task不动还在等待链表里。如果返回的是CanResume那么agent不动只把task从等待的tasks链表里移除之后agent内还有这个task可以继续处理直到返回为其他内容。然后是ShutDown里调用的移除所有任务。先得到等待中的任务和工作中agent的数量从而得到所有task的数量。遍历等待中的task直接通过引用池回收然后清空链表。如果是工作中的task那遍历工作中agent先把当前遍历的工作中agent的task取出来然后将agent重置并且压到空闲agent里再通过引用尺将task回收。最后清理工作中agent。然后返回清理的task的数量。添加Agent传递参数为继承了ITaskAgent的具体代理对象。执行这个agent的初始化然后把它放入空闲agent里。根据任务的编号来获取具体的任务信息。先遍历工作中的Agents取出遍历的那个agent的Task判断一下ID是否相同相同就把信息放到一个TaskInfo对象内并返回。如果工作中Agent里没有那么就从等待中task链表循环如果有ID一样的就将task的信息组成一个TaskInfo并返回。如果都没有找到返回一个默认的TaskInfo。根据tag获取任务信息返回数组或者List。内部通过遍历工作中Agents判断agent的task的tag和需要的一样就把信息创建一个TaskInfo对象内并加到返回数组里然后遍历等待中的Task链表如果tag一样就也创建TaskInfo对象加到返回数组里。这两个都是获取所有Task的信息遍历工作中Agents和等待中Task然后根据它们的Task的信息构成一个TaskInfo对象加到返回数组里。添加任务和移除任务。添加任务参数类型必须继承TaskBase然后从等待中Task取最后一个节点然后通过while遍历如果有节点内的task的优先级比传入的task的优先级高那么就停止循环将新添加的task放在这个节点的后面如果没有新加的task的优先级大的就把current设置为current的前一个直到遍历current为空结束退出循环此时将新节点加在最前面。移除任务传入任务序列号ID遍历等待中tasks内的task的序列号id是否和需要的一样如果一样就把这个task从等待tasks中移除然后通过引用池回收之后返回true如果前面的没有返回那么说明等待中tasks链表里没有找到就从工作中agent里找。从工作中agent的头部拿只要遍历的不为空就持续遍历判断agent内的task的序列编号是否是需要的如果是就先将当前工作中的agent重置然后压入空闲agent里再从工作agents里移除掉之后通过引用池回收这个task返回true。如果返回完了都没有就返回false说明没找到这个id的task。根据tag移除任务。先从等待中Task链表拿第一个节点然后从头遍历取到每一个节点里的task并且判断tag是否与需要的相等如果相等就把这个task从等待tasks链表里移除然后通过引用池回收之后计数增加。之后从工作中agent的头部开始遍历取到当前工作中的agent从agent里取到task。如果task的tag与需要的匹配那么将当前agent执行reset复位然后压到空闲agents里并且从工作中agents里移除然后通过引用池回收这个task。之后计数增加。最后返回回收的相同的tag的task的数量。OKTaskPool模块结束了因为是internal所以无法直接测试后续看Resources模块的时候会用到之后直接看实现好的Agent和BaseTask子类。
延伸阅读

更多相关文章

2026/10/30 4:51:07

如何用密码保护PPS文件?看这篇就够了

PPS文件最方便的地方,就是双击直接全屏播放,不需要手动点“幻灯片放映”。正因为这个特性,很多人会把定稿的演示文稿存成PPS发给客户或领导。如果你的PPS文件比较重要,也可以通过它的密码功能来保护文件。PPS的密码分为“打开密码…

2026/10/30 4:51:06

Scrapy-Redis分布式集群全改造:从单机脚本到10节点生产环境,踩完所有坑的实战总结

去年接手一个工业数据采集项目,百万级页面的采集任务,单机Scrapy跑满并发也要七天才能跑完一轮,中间但凡机器宕机、进程崩溃,进度直接清零重来。一开始想的是加配置、提并发,结果单机能压榨的性能到顶了,速度还是上不去,稳定性也差。 后来花了一周时间把整套架构改成Sc…

2026/10/30 4:51:06

烟火检测落地实战:YOLO处理监控视频流的小目标难题与全链路优化方案

去年给工业园区做智慧消防改造,要把园区200多路监控全部接入AI烟火智能检测,替代传统的烟感温感传感器。传统方案的痛点很明显:室内还好,室外开阔区、仓储堆场、林区根本覆盖不到,等传感器报警的时候火已经烧起来了,完全失去了早期预警的意义。 一开始团队图省事,直接拿…

2026/10/30 11:28:40

PL/SQL Developer 配置与 Oracle 开发实战指南

简介:PLSQL Developer是一款专为Oracle数据库开发与管理设计的专业IDE工具,面向DBA、后端开发者及数据库课程学习者,解决Oracle环境下的SQL编写、PL/SQL调试、对象管理与性能优化等核心问题。资源包为官方精简版安装文件,压缩格式…

2026/10/30 11:28:40

Matlab下贝叶斯优化CNN-BiLSTM回归预测超参数调参指南

简介:一套基于贝叶斯算法优化CNN-BiLSTM的回归预测Matlab实现,面向需要完成多输入单输出回归任务的研究生、工程师与竞赛选手,可有效解决模型超参数难确定、时序特征提取不充分等问题。代码在Matlab2020b及以上版本运行,整体框架清…

2026/10/30 11:28:40

Flask+ChatGPT+Docker:微信公众号聊天机器人源码部署与避坑指南

简介:这份资源是一套基于Flask框架、ChatGPT接口与Docker容器化部署的微信公众号聊天机器人完整项目,面向具备Python基础、希望快速搭建智能对话公众号的开发者与学习者。项目将后端服务、模型调用与容器编排整合在一起,适合用作课程设计、个…

2026/10/30 11:28:40

惯导倾斜测量能解决什么:外业场景对号入座

惯导倾斜测量是近几年 RTK 上最实用的新功能之一。它的宣传词常是"走到哪测到哪、不用对中整平",但对作业队来说,真正要问的是:它到底能解决哪些具体问题?哪些场景它能救场,哪些场景它没用? 这篇把惯导倾斜测量能解决的问题逐个场景摆出来,按"救得了/用得上/用…

2026/10/30 11:28:40

minimumAnswers:用二项分布反解众包多数投票最少答案数与置信度配额

简介:这是一个针对众包系统最少答案数量估计的Java开源项目,面向众包平台开发者、算法研究者以及相关课程实践者。项目从任务类型划分、工作者可信度评估和模拟测试三个角度入手,引入统计学中关于置信水平、误差范围与样本量计算的方法&#…

2026/10/30 11:23:39

MATLAB YOLOv3车辆检测实战:从环境配置到mAP调优的避坑指南

简介:这是一份面向计算机视觉初学者与深度学习入门者的Matlab实战资源,围绕YOLOV3算法实现车辆目标识别与检测,适合用于课程设计、项目验证及算法原理学习。压缩包共78个文件,约11.3MB,包含71张jpg车辆图像作为训练与测…

2026/10/29 17:05:52

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/29 17:06:02

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/29 17:06:13

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/30 0:00:46

NCP1342高频准谐振反激控制器:从设计约束到验收的完整方案

简介:NCP1342 高频准谐振反激控制器应用介绍译文文档,面向电源设计工程师、硬件研发人员及开关电源学习者,帮助读者跨越英文原版资料的语言门槛,系统理解这款高集成度 QR Flyback 控制器的设计要点。文档围绕芯片核心特性展开&…

2026/10/30 0:00:46

NCP1342准谐振反激电源设计:从选型到验收的全流程解析

简介:这份文档面向电源设计工程师与开关电源学习者,系统梳理NCP1342高频准谐振反激控制器的应用要点,帮助读者快速理解这款高集成度离线电源变换器控制芯片的工作机制与设计方法。内容涵盖芯片核心特性、引脚功能定义、电气特性参数表、最大额…

2026/10/30 0:00:46

Web系统自动登出机制设计与实现全解析

1. 系统自动登出机制的设计初衷在各类Web应用和后台管理系统中,自动登出功能早已成为标配。这个看似简单的功能背后,实际上涉及用户安全、资源管理和体验优化的多重考量。作为从业十多年的老开发,我见过太多因为登出逻辑设计不当导致的安全事…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑