Fantasy中定时器得驱动原理
一、服务器框架启动
public static async FTask Start(){// 启动ProcessStartProcess().Coroutine();await FTask.CompletedTask;while (true){ThreadScheduler.Update();Thread.Sleep(1);}}
二、主线程
Fantasy.ThreadScheduler.Update
internal static void Update(){MainScheduler.Update();}
三、每个Scene的调度
Fantasy.MainScheduler.Update
public void Update(){ThreadSynchronizationContext.Update();var initialCount = _queue.Count;while (initialCount-- > 0){if(!_queue.TryDequeue(out var scene)){continue;}if (scene.IsDisposed){continue;}scene.Update();_queue.Enqueue(scene);}}
四、Scene执行一下Update
Fantasy.Scene.Update
internal void Update(){try{SceneUpdate.Update();}catch (Exception e){Log.Error(e);}}
五、下面的儿子每个执行一下
Fantasy.Net\Runtime\Core\Entitas\Component\EntityComponent.cs:413
/// <summary>/// 执行实体系统的更新逻辑/// </summary>public void Update(){var updateQueueCount = _updateQueue.Count;while (updateQueueCount-- > 0){var updateQueueStruct = _updateQueue.Dequeue();if (updateQueueStruct.IsStop){continue;}if (!_updateSystems.TryGetValue(updateQueueStruct.Type, out var updateSystem)){continue;}var entity = Scene.GetEntity(updateQueueStruct.RunTimeId);if (entity == null || entity.IsDisposed){_updateQueueDic.Remove(updateQueueStruct.RunTimeId);continue;}_updateQueue.Enqueue(updateQueueStruct);try{updateSystem.Invoke(entity);}catch (Exception e){Log.Error($"{updateQueueStruct.Type.FullName} Update Error {e}");}}}
六、定时器执行一下
Fantasy.Timer.TimerComponentUpdateSystem.Update
public sealed class TimerComponentUpdateSystem : UpdateSystem<TimerComponent>{protected override void Update(TimerComponent self){self.Update();}}
Fantasy.Timer.TimerComponent.Update
public void Update(){Net.Update();
#if FANTASY_UNITYUnity.Update();
#endif}
Fantasy.Net\Runtime\Core\Entitas\Component\TimerComponent\TimerScheduler\TimerSchedulerNet.cs:43
/// <summary>/// 驱动方法,只有调用这个方法任务系统才会正常运转。/// </summary>public void Update(){if (_timeId.Count == 0){ return;}var currentTime = Now(); if (currentTime < _minTime){ return;}// 遍历时间ID列表,查找超时的计时器任务foreach (var (key, _) in _timeId){if (key > currentTime){_minTime = key;break;}_timeOutTime.Enqueue(key);}// 处理超时的计时器任务while (_timeOutTime.TryDequeue(out var time)){var timerIds = _timeId[time];for (var i = 0; i < timerIds.Count; ++i){_timeOutTimerIds.Enqueue(timerIds[i]);}_timeId.Remove(time);// _timeId.RemoveKey(time);}if (_timeId.Count == 0){_minTime = long.MaxValue;}// 执行超时的计时器任务的回调操作while (_timeOutTimerIds.TryDequeue(out var timerId)){if (!_timerActions.Remove(timerId, out var timerAction)){continue;}// 根据计时器类型执行不同的操作switch (timerAction.TimerType){case TimerType.OnceWaitTimer:{var tcs = (FTask<bool>)timerAction.Callback;tcs.SetResult(true);break;}case TimerType.OnceTimer:{if (timerAction.Callback is not Action action){Log.Error($"timerAction {timerAction.ToJson()}");break;}action();break;}case TimerType.RepeatedTimer:{if (timerAction.Callback is not Action action){Log.Error($"timerAction {timerAction.ToJson()}");break;}timerAction.StartTime = Now();AddTimer(ref timerAction);action();break;}}}}
相关文章:
Fantasy中定时器得驱动原理
一、服务器框架启动 public static async FTask Start(){// 启动ProcessStartProcess().Coroutine();await FTask.CompletedTask;while (true){ThreadScheduler.Update();Thread.Sleep(1);}} 二、主线程 Fantasy.ThreadScheduler.Update internal static void Update(){MainS…...
【反转链表】力扣 445. 两数相加 II
一、题目 二、思路 加法运算是从低位开始,向高位进位,因此需要将两个链表进行反转,再进行对齐后的相加操作。力扣 2. 两数相加 三、题解 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode …...
SpringBoot 项目中使用 spring-boot-starter-amqp 依赖实现 RabbitMQ
文章目录 前言1、application.yml2、RabbitMqConfig3、MqMessage4、MqMessageItem5、DirectMode6、StateConsumer:消费者7、InfoConsumer:消费者 前言 本文是工作之余的随手记,记录在工作期间使用 RabbitMQ 的笔记。 1、application.yml 使…...
Uniapp 安装安卓、IOS模拟器并调试
一、安装Android模拟器并调试 1. 下载并安装 Android Studio 首先下载 Mac 环境下的 Android Studio 的安装包,为dmg 格式。 下载完将Android Studio 向右拖拽到Applications中,接下来等待安装完成就OK啦! 打开过程界面如下图所示…...
JavaScript 中的原型和原型链
JavaScript 中的原型和原型链也是一个相对较难理解透彻的知识点,下面结合详细例子来进行说明: 一、原型的概念 在 JavaScript 中,每个函数都有一个 prototype 属性,这个属性指向一个对象,这个对象就是所谓的 “原型对…...
数组变换(两倍)
数组变换 以最大元素为基准元素,判读其他元素能否通过 x 2 成为最大值! 那么怎么判断呢: max % arr[i] 0arr[i] * 2 ^n max int x 2 ^ n max / arr[i] 3.只需判断 这个 x 是不是 2 的 n 次放就可以了! 判断 是否为 2 的 n 次 …...
GBN协议、SR协议
1、回退N步(Go-Back-N,GBN)协议: 总结: GBN协议的特点: (1)累计确认机制:当发送方收到ACKn时,表明接收方已正确接收序号为n以及序号小于n的所有分组,发送窗…...
三维扫描检测仪3d扫描测量尺寸-自动蓝光测量
在现代工业及生产过程中,精确、高效的尺寸检测是保证产品质量、提升生产效率的关键因素。 红、蓝光测量,以其高精度、高效率和非接触式的特点,在工业及生产中发挥着越来越重要的作用。蓝光测量技术利用蓝色激光光源,通过扫描被测…...
大模型翻译能力评测
1. 背景介绍 随着自然语言处理技术的飞速发展,机器翻译已经成为一个重要的研究领域。近年来,基于大模型的语言模型在机器翻译任务上取得了显著的进展。这些大模型通常具有数亿甚至数千亿的参数,能够更好地理解和生成自然语言。 但是…...
MySQL隐式转换造成索引失效
一、什么是 MySQL 的隐式转换? MySQL 在执行查询语句时,有时候会自动帮我们进行数据类型的转换,这个过程就是隐式转换。比如说,我们在一个 INT 类型的字段上进行查询,但是传入的查询条件却是字符串类型的值,…...
SuperMap Objects组件式GIS开发技术浅析
引言 随着GIS应用领域的扩展,GIS开发工作日显重要。一般地,从平台和模式上划分,GIS二次开发主要有三种实现方式:独立开发、单纯二次开发和集成二次开发。上述的GIS应用开发方式各有利弊,其中集成二次开发既可以充分利…...
多组数输入a+b:JAVA
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 输入描述: 输入包含多组数据,每组数据输入一行,包含两个整数 输出描述: 对于每组数据输出一行包含一个整数表示两个整数的和 代码: import java.util.Scanner; pu…...
R语言结构方程模型(SEM)在生态学领域中的应用
目录 专题一、R/Rstudio简介及入门 专题二、结构方程模型(SEM)介绍 专题三:R语言SEM分析入门:lavaan VS piecewiseSEM 专题四:SEM全局估计(lavaan)在生态学领域高阶应用 专题五࿱…...
架构-微服务-服务调用Dubbo
文章目录 前言一、Dubbo介绍1. 什么是Dubbo 二、实现1. 提供统一业务api2. 提供服务提供者3. 提供服务消费者 前言 服务调用方案--Dubbo 基于 Java 的高性能 RPC分布式服务框架,致力于提供高性能和透明化的 RPC远程服务调用方案,以及SOA服务治理方案。…...
【SpringBoot问题】IDEA中用Service窗口展示所有服务及端口的办法
1、调出Service窗口 打开View→Tool Windows→Service,即可显示。 2、正常情况应该已经出现SpringBoot,如下图请继续第三步 3、配置Service窗口的项目启动类型。微服务一般是Springboot类型。所以这里需要选择一下。 点击最后一个号,点击Ru…...
OpenCV 图像轮廓查找与绘制全攻略:从函数使用到实战应用详解
摘要:本文详细介绍了 OpenCV 中用于查找图像轮廓的 cv2.findContours() 函数以及绘制轮廓的 cv2.drawContours() 函数的使用方法。涵盖 cv2.findContours() 各参数(如 mode 不同取值对应不同轮廓检索模式)及返回值的详细解析,搭配…...
电机驱动MCU介绍
电机驱动MCU是一种专为电机控制设计的微控制器单元,它集成了先进的控制算法和高性能的功率输出能力。 电机驱动MCU采用高性能的处理器核心,具有快速的运算速度和丰富的外设接口。它内置了专业的电机控制算法,包括PID控制、FOC(Fi…...
人工智能学习框架详解及代码使用案例
人工智能学习框架详解及代码使用案例 人工智能(AI)学习框架是构建和训练AI模型的基础工具,它们提供了一组预定义的算法、函数和工具,使得开发者能够更快速、更高效地构建AI应用。本文将深入探讨人工智能学习框架的基本概念、分类、优缺点、选择要素以及实际应用,并通过代…...
修改Textview中第一个字的字体,避免某些机型人民币¥不显示
在 Android 中,系统提供了三种常用的字体类型,分别是: Serif(衬线字体): 这种字体有明显的衬线或笔画末端装饰,通常用于印刷品和书籍,给人一种正式和优雅的感觉。示例:Typeface.SERI…...
彻底理解quadtree四叉树、Octree八叉树 —— 点云的空间划分的标准做法
1.参考文章: (1)https://www.zhihu.com/question/25111128 这里面的第一个回答,有一幅图: 只要理解的四叉树的构建,对于八叉树的构建原理类比方法完全一样:对于二维平面内的随机分布的这些点&…...
告别桌面混乱!Ubuntu 16.04 多桌面+Terminator分屏,打造程序员高效工作流
Ubuntu 16.04多桌面与Terminator分屏:构建程序员的高效工作流 作为一名长期在Ubuntu环境下工作的开发者,我深刻体会到工作环境配置对效率的影响。桌面混乱、窗口堆叠、频繁切换不仅浪费时间,还会打断编程的"心流"状态。经过多次迭代…...
iOS越狱防火墙ijfw:从网络流量监控到精细化应用管控实战
1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目,叫ijfw,全称是iOS Jailbreak Firewall。顾名思义,这是一个专门为越狱后的iOS设备设计的防火墙工具。如果你和我一样,是个喜欢在iPhone上“折腾”的玩家,或者对…...
基于EVE ESI API与AI Agent的自动化游戏监控与数据分析实践
1. 项目概述:为AI助手注入EVE宇宙的灵魂 如果你是一名《EVE Online》的玩家,同时又对AI自动化工具感兴趣,那么你很可能和我一样,长期被一个矛盾所困扰:一方面,EVE这个沙盒宇宙充满了需要监控和管理的日常事…...
开源情报自动化工具OpenClaw:模块化设计与实战部署指南
1. 项目概述:从“Resolver-TNG/ogas-openclaw”看开源情报自动化最近在开源情报(OSINT)和自动化数据采集的圈子里,一个名为“ogas-openclaw”的项目引起了我的注意。这个项目托管在Resolver-TNG的组织下,名字本身就很有…...
如何快速掌握Unitree Go2机器人ROS2开发:面向初学者的完整教程
如何快速掌握Unitree Go2机器人ROS2开发:面向初学者的完整教程 【免费下载链接】go2_ros2_sdk Unofficial ROS2 SDK support for Unitree GO2 AIR/PRO/EDU 项目地址: https://gitcode.com/gh_mirrors/go/go2_ros2_sdk Unitree Go2 ROS2 SDK是一个强大的开源项…...
GTX 1660实战AI视频生成:低显存环境下的模型瘦身与帧插值方案
1. 项目概述:在入门级显卡上跑通AI视频生成最近看到不少朋友对AI视频生成很感兴趣,但总被“需要RTX 4090”、“至少24GB显存”这类硬件门槛劝退。作为一个常年混迹于“丐版”硬件圈的老玩家,我决定用我手头这块服役多年的GTX 1660(…...
别再只用轮盘赌了!遗传算法选择算子实战对比:Python代码实现与性能调优心得
遗传算法选择算子深度实战:从轮盘赌到锦标赛的Python优化指南 在解决复杂优化问题时,遗传算法展现出了惊人的适应能力。但许多开发者止步于基础的轮盘赌选择(Roulette Wheel Selection),却不知不同选择策略对算法性能的…...
3分钟掌握Windows安装APK:告别复杂模拟器的终极方案
3分钟掌握Windows安装APK:告别复杂模拟器的终极方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经遇到过这样的场景?同事发来一个实…...
深度学习在系外行星探测中的应用:ExoDNN框架解析与实践
1. 项目概述:当深度学习遇见星空系外行星探测,这个听起来就充满科幻感的领域,在过去二十年里彻底改变了我们对宇宙的认知。从最初通过“凌星法”和“径向速度法”发现几颗气态巨行星,到如今TESS、开普勒等太空望远镜的海量数据中&…...
中小团队如何利用 Taotoken 统一管理多个大模型 API 调用与成本
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 中小团队如何利用 Taotoken 统一管理多个大模型 API 调用与成本 对于需要同时调用多种 AI 模型的中小开发团队而言,技术…...
