TiXL 布尔信号处理算子全解:CacheBoolean / DelayBoolean / DelayTriggerChange / KeepBoolean 的时序控制实战
音视频图形学桌面应用【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址https://gitcode.com/GitHub_Trending/t3/t3点击查看免费下载导读在 TiXLt3实时动态图形系统中布尔Boolean信号是最常用的控制信号之一——无论是键盘/OSC 触发、节拍检测、还是 UI 交互最终都汇聚成一个个 true/false 脉冲。直接使用原始布尔信号常常会导致一帧内多次更新、状态闪烁、或难以实现按住一定时长才生效等交互需求。本文基于官方算子库文档 Lib.numbers.bool.process系统讲解其中 4 个布尔处理算子CacheBoolean缓存、DelayBoolean按帧延迟、DelayTriggerChange变化延迟 / MonoFlop、KeepBoolean状态保持并结合仓库源码Operators/Lib/Symbols/numbers/bool/process逐一剖析其底层实现原理、参数语义与典型应用场景。读完本文你将能够准确判断何时选用哪个算子并能在自己的实时作品中正确配置它们的参数。算子族概览四个布尔处理算子的定位根据官方文档 READMELib.numbers.bool.process命名空间下共注册了 4 个算子它们解决的是布尔信号的时序与状态管理这一组问题算子核心作用文档定位CacheBoolean阻止多次更新转发先前计算好的布尔值CacheBoolean.mdDelayBoolean将布尔值的变化按帧数延迟DelayBoolean.mdDelayTriggerChange将布尔标志的变化按时长延迟在 vvvv 中称为 MonoFlopDelayTriggerChange.mdKeepBoolean保持标志状态直到被重置KeepBoolean.md从源码结构看这 4 个算子都位于Operators/Lib/Symbols/numbers/bool/process/目录每个算子由三部分组成.csC# 实现、.t3算子定义与输入默认值和.t3ui编辑器中的 UI 布局。它们都继承自InstanceT泛型基类位于 Core/Operator/Instance.cs通过[Guid]特性注册唯一标识通过[Input]/[Output]特性声明插槽。文档末尾标注Auto-generated from the operator library说明该 README 由算子库自动生成四个子文档的描述文本实际来自每个算子编辑器中录入的说明——因此本文将以源码实现为准对文档描述进行深度展开。CacheBoolean阻止重复更新的布尔缓存文档定义Prevents multiple updates by forwarding a boolean value that was computed earlier.阻止多次更新转发先前计算好的布尔值。输入输出类别名称类型OutputResultSystem.Boolean源码剖析CacheBoolean.cs 的实现非常精简其核心逻辑在于Update方法中的分支判断if (!Value.HasInputConnections) { Result.Value Value.GetValue(context); return; } if (Value.TryGetFirstConnection(out var connection) connection is Slotbool boolValue) { Result.Value boolValue.Value; }从源码可以看出它的工作方式当输入Value没有连接任何上游节点时直接求值Value.GetValue(context)并输出当存在连接时则读取上游Slotbool节点已经计算好的值boolValue.Value而不再触发上游重新求值。这解释了文档中prevent multiple updates的准确含义在 TiXL 的惰性求值架构下一个输出槽被多个下游节点连接时可能被重复更新CacheBoolean作为中间节点缓存上游已经算出的布尔结果让下游消费者读取的是同一份稳定值从而避免一帧内同一信号被多次求值带来的抖动与开销。典型场景将一次计算结果分发给多个后续逻辑分支时用 CacheBoolean 保证所有分支拿到一致且只计算一次的布尔值。DelayBoolean按帧数延迟布尔信号文档定义原文档对该算子暂无文字描述No description yet但输入参数表给出了明确语义名称Relevancy Type描述TriggerBoolean Required布尔输入FrameCountInt32定义布尔变化被延迟多少帧输出名称类型DelayedTriggerSystem.Boolean源码剖析DelayBoolean.cs 使用一个Queuebool环形缓冲实现帧级延迟var frameCount FrameCount.GetValue(context).Clamp(0, 500); var current Trigger.GetValue(context); var result false; if (frameCount 0) { _queue.Clear(); result current; } else { while (_queue.Count frameCount) { result _queue.Dequeue(); } _queue.Enqueue(current); } DelayedTrigger.Value result;实现要点FrameCount 被Clamp(0, 500)限制取值被钳制在 0500 帧之间避免过大的延迟值造成队列无限增长。你可以用 MathUtils 确认这是Clamp的扩展实现。FrameCount 0 时直通清空队列并直接输出当前输入此时算子相当于纯透传。队列长度恒等于 FrameCount每帧先弹出最旧的元素作为输出再压入当前值实现了严格的 N 帧延迟。每帧只更新一次通过Math.Abs(context.LocalFxTime - _lastUpdateTime) 0.001f判断当前帧是否已更新过并记录_lastUpdateTime防止同一帧内重复处理。此外输出槽DelayedTrigger标记了DirtyFlagTrigger.Animated见 DirtyFlagTrigger.cs表示该输出随时间变化需要每帧重新求值——这与延迟逻辑每帧推进的语义一致。典型场景需要把信号精确延迟整数帧例如对齐节拍网格、实现连击判定窗口时使用。从默认配置DelayBoolean.t3可见FrameCount默认值为0即默认直通。DelayTriggerChangeMonoFlop 式布尔变化延迟这是四个算子中功能最丰富、文档描述最详细的一个也是官方文档强调的重点算子。文档定义Delays the change of a boolean flag. This can be useful for implementing interactions where a value needs to stay true for a minimum duration. In DelayTrue mode, it will immediately switch to true but delay switching back to false. Note: This is NOT a queue. Frequent changes of the incoming signal can lead to the delayed state filtering out changes within the delay duration. In vvvv, this op is called a MonoFlop. 延迟布尔标志的变化。这对实现值需要保持 true 至少一段最短时长的交互非常有用。在 DelayTrue 模式下它会立即切换为 true但延迟切换回 false。注意这不是队列。输入信号频繁变化可能导致延迟期间的变化被过滤掉。在 vvvv 中此算子被称为 MonoFlop。Also see DelayBoolean if you want to delay a signal.若想延迟一个信号另见 DelayBoolean。输入输出名称Relevancy Type描述TriggerBoolean Required—DelayDurationSingle—ModeInt32—TimeModeInt32—名称类型DelayedTriggerSystem.BooleanRemainingTimeSystem.Single源码剖析三种延迟模式DelayTriggerChange.cs 内部定义了核心枚举DelayModes这就是Mode输入的取值private enum DelayModes { DelayTrue, // 模式 0默认 DelayFalse, // 模式 1 DelayBoth, // 模式 2 }三种模式的延迟策略由Update方法中的 switch 分支决定switch (delayMode) { case DelayModes.DelayTrue: refTime _lastTrueTime; stateIfDelayed true; break; case DelayModes.DelayFalse: stateIfDelayed false; refTime _lastFalseTime; break; case DelayModes.DelayBoth: stateIfDelayed _stateBeforeChange; refTime _lastChangeTime; break; } var remainingTime refTime - currentTime delayDuration; var isDelayed remainingTime 0; RemainingTime.Value (float)remainingTime; DelayedTrigger.Value isDelayed ? stateIfDelayed : _triggered;DelayTrue默认枚举值 0以最近一次输入变为 true 的时刻_lastTrueTime为参考点。输入一旦变 true输出立即跟随为 true之后即使输入变回 false只要DelayDuration未走完输出仍保持 true。这正是文档所说的immediately switch to true but delay switching back to false用于保证 true 至少维持最短时长。DelayFalse对称地输出立即跟随 false但延迟切回 true以_lastFalseTime为参考。DelayBoth以最近一次状态变化时刻_lastChangeTime为参考在延迟期间保持变化前的旧状态_stateBeforeChange即上升沿与下降沿都延迟。isDelayed remainingTime 0的判定加上RemainingTime输出实时给出剩余延迟秒数可为负让下游可以驱动倒计时显示或进度动画。时间基准 TimeMode七种时间域TimeMode输入由内部枚举TimeModes映射默认值为6AppRunTime_InSecs见 DelayTriggerChange.t3 的DefaultValue: 6枚举值名称时间来源源码0LocalFxTime_InBarscontext.LocalFxTime本地 FX 时间以小节计1LocalFxTime_InSecscontext.Playback.SecondsFromBars(context.LocalFxTime)2LocalTime_InBarscontext.LocalTime3LocalTime_InSecscontext.Playback.SecondsFromBars(context.LocalTime)4PlayTime_InBarscontext.Playback.TimeInBars5PlayTime_InSecscontext.Playback.TimeInSecs6AppRunTime_InSecs默认Playback.RunTimeInSecs选择不同时间域会影响DelayDuration的计量单位与起点默认的AppRunTime_InSecs是自应用启动以来累计的秒数适合与具体秒数直接比较而_InBars系列则让延迟时长可以按音乐小节计算与 TiXL 的节拍同步体系参见 Core/Audio/Timing/BeatSynchronizer.cs结合可实现与 BPM 挂钩的延迟效果。与 DelayBoolean 的区别及文档中的两个重要警告计量单位不同DelayBoolean 按帧数延迟DelayTriggerChange 按**时长DelayDuration 秒**延迟。官方文档特别提示Also see DelayBoolean if you want to delay a signal——如果需要纯粹的、可预测的信号搬运延迟应选用按帧的 DelayBoolean。这不是队列NOT a queueDelayTriggerChange 不缓存历史信号序列。文档明确警告输入在延迟期间频繁翻转时延迟期间内的变化会被过滤掉——因为逻辑只记录最近一次 true / false / 变化时刻这几个时间点而不是把每次变化都排队。因此它适合最短保持时长类需求不适合精确复现一连串脉冲的时序。典型场景按键防抖、闪光灯最小显示时长、按钮按住高亮的最低时长、节拍同步的门限信号等交互逻辑。KeepBoolean保持标志状态直到重置文档定义Keeps the state of flag until it is reset.保持标志状态直到被重置。输入输出名称Relevancy Type描述ValueBoolean Relevant—FreezeBoolean Relevant—ModeInt32—名称类型ResultSystem.BooleanTimeSinceFreezeSystem.Single源码剖析冻结与两种更新模式KeepBoolean.cs 维护一个内部_frozenValue冻结值Mode枚举决定何时把Value的最新值写入冻结值private enum Modes { FreezeWhileTrue, // 模式 0默认 UpdateWhenSwitchingToTrue, // 模式 1 }更新逻辑节选var wasTriggered MathUtils.WasTriggered(freeze, ref _freeze); if (wasTriggered) { _freezeTime context.LocalTime; } if (mode Modes.FreezeWhileTrue) { if (!freeze) { _frozenValue newValue; // 未冻结时持续跟踪最新值 } } else { if (wasTriggered) { _frozenValue newValue; // 仅在 Freeze 上升沿捕获一次 } } Result.Value _frozenValue; TimeSinceFreeze.Value (float)(context.LocalTime - _freezeTime);FreezeWhileTrue默认模式 0当Freeze为 false 时Result跟随Value实时变化当Freeze变为 true冻结生效后Result锁定为冻结瞬间的值直到Freeze再次为 false 才解除锁定、重新跟随。UpdateWhenSwitchingToTrue模式 1在Freeze的上升沿由MathUtils.WasTriggered检测即 false→true 的那一帧捕获一次Value并写入冻结值之后即使Freeze保持 true也不再更新。即上升沿采样一次然后一直保持。TimeSinceFreeze输出自冻结时刻_freezeTime起经过的本地时间秒且该输出同样标注了DirtyFlagTrigger.Animated适合驱动与冻结时长相关的动画或超时判断。典型场景锁定某个按键在按下瞬间的开关状态、记录某个事件发生时的布尔现场、实现直到明确重置前一直保持的开关寄存器。四个算子的选型速查与实战建议结合官方文档与源码给出以下选型决策逻辑只是想缓存/分发一个已算好的布尔值避免重复更新→ 选CacheBoolean。它不引入任何延迟只做一次求值、多次复用。需要把布尔信号精确延迟整数帧如对齐帧网格、构建固定延迟线 → 选DelayBoolean用FrameCount0500 帧控制延迟量。需要最短保持时长语义true 至少维持 N 秒、防抖、MonoFlop → 选DelayTriggerChange用DelayDurationModeDelayTrue / DelayFalse / DelayBothTimeMode默认 AppRunTime_InSecs组合。牢记它不是队列不适合复现频繁变化的脉冲序列。需要把布尔状态冻结/保持直到解除→ 选KeepBoolean用Freeze与ModeFreezeWhileTrue / UpdateWhenSwitchingToTrue选择是持续锁定还是上升沿采样并可读取TimeSinceFreeze驱动超时动画。需要特别留意的是DelayBoolean 与 DelayTriggerChange 虽然都名为延迟但前者按帧、后者按时长且内部机制完全不同帧队列 vs 时间戳比较官方文档在 DelayTriggerChange 页中明确指引了二者边界实战中按延迟信号搬运与最短时长保持两类需求区分即可。小结Lib.numbers.bool.process是 TiXL 布尔信号时序处理的完整工具集CacheBoolean 负责求值收敛DelayBoolean 负责帧级搬运DelayTriggerChange 负责时长级保持MonoFlopKeepBoolean 负责状态冻结。本文以官方文档为骨架、以 Operators/Lib/Symbols/numbers/bool/process 下的 C# 源码与.t3默认配置为佐证还原了每个算子的内部状态机与参数语义。在搭建实时交互图形时把这四个算子放在手边即可高效处理绝大多数布尔时序问题。更多算子细节可回到官方算子库文档目录 .help/docs/operators 继续查阅。赞分享音视频图形学桌面应用【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址https://gitcode.com/GitHub_Trending/t3/t3点击查看免费下载相关推荐TiXL 算子解析CacheBoolean —— 用「提前计算好的布尔值」阻止重复更新TiXL 算子解析CacheBoolean —— 用「提前计算好的布尔值」阻止重复更新 CacheBoolean 是 TiXL 实时运动图形库中一个看似不起眼音视频图形学桌面应用TiXL TriggerAnim 算子完全指南用布尔触发信号驱动实时交互动画TiXL TriggerAnim 算子完全指南用布尔触发信号驱动实时交互动画 TiXLt3是一套用于创作实时动态图形的开源软件而 TriggerAnim音视频图形学桌面应用Zeus未来展望路线图分析与社区贡献完整指南 Zeus未来展望路线图分析与社区贡献完整指南 Zeus作为一个革命性的Rails应用预加载工具已经在开发社区中赢得了广泛的赞誉。这个强大的工具能够在音视频图形学桌面应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

BrewUI:让Homebrew包管理可视化,依赖清理更简单

BrewUI:让Homebrew包管理可视化,依赖清理更简单

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

2026/9/22 2:30:25 阅读更多 →
colibri:用YAML优雅配置Karabiner,打造高效键盘映射

colibri:用YAML优雅配置Karabiner,打造高效键盘映射

1. 为什么键盘重度用户需要 colibri1.1 Karabiner 配置的真实痛点先聊个背景。macOS 上但凡想把键盘效率玩出花来,基本绕不开 Karabiner-Elements。这个工具本身确实强大,能把任意按键改造成任意功能,支持按住、双击、同时按下这些复杂手势&a…

2026/9/21 20:00:52 阅读更多 →
基于Matlab的视频测速仪设计:帧间差分法实现与GUI开发详解

基于Matlab的视频测速仪设计:帧间差分法实现与GUI开发详解

简介:基于Matlab的测速仪课程设计完整报告,面向电子信息类专业本科生及需要完成多普勒测速仿真设计的学习者。报告围绕多普勒效应回波信号处理展开,详细阐明输入回波与加性噪声信号生成、回波频移与目标速度换算关系、离散傅立叶变换频谱分析…

2026/9/22 0:55:11 阅读更多 →

最新新闻

国产男女猛烈无遮挡A片游戏源码解析:3步搞定从零搭建

国产男女猛烈无遮挡A片游戏源码解析:3步搞定从零搭建

国产男女猛烈无遮挡A片游戏源码解析:3步搞定从零搭建 看了一堆教程还是不会写项目?别急,今天咱们直接上干货。很多人卡在“看懂了代码,但自己敲不出来”这一步,核心问题在于缺乏对源码解析的深度理解。 项目目标与场景界定…

2026/9/22 3:12:53 阅读更多 →
搞定苦难辉煌高频面试题:从0到1的性能优化实战

搞定苦难辉煌高频面试题:从0到1的性能优化实战

搞定苦难辉煌高频面试题:从0到1的性能优化实战 学会语法却不知怎么搭项目,这是无数开发者转型期的噩梦。你背下了Python的装饰器、Java的并发包,却在面对一个高并发接口时手足无措,代码跑得慢得像蜗牛。更扎心的是,当你翻开那些【高频面试题…

2026/9/22 3:12:53 阅读更多 →
5个核心点搞定taob1性能优化,拒绝死记硬背

5个核心点搞定taob1性能优化,拒绝死记硬背

5个核心点搞定taob1性能优化,拒绝死记硬背 官方文档动辄几十页,读起来像看天书,面试时却只问最扎心的三个点:瓶颈在哪、怎么改、数据涨了多少。很多人盯着 taob1 相关的底层机制看了半天,脑子还是一团浆糊。其实, taob1…

2026/9/22 3:12:53 阅读更多 →
处理器手机2026最新架构拆解:别只背语法,搞懂指令流水线

处理器手机2026最新架构拆解:别只背语法,搞懂指令流水线

处理器手机2026最新架构拆解:别只背语法,搞懂指令流水线 是不是刚学会几行Python或Java代码,看着手机里的App跑得飞起,自己却连个像样的项目都搭不起来?这种“语法熟、项目懵”的断崖式体验,在2026年的开发圈里太常见了。很多人把…

2026/9/22 3:11:52 阅读更多 →
2026最新网络收音机电脑版卡顿救急指南

2026最新网络收音机电脑版卡顿救急指南

2026最新网络收音机电脑版卡顿救急指南 刚把同事发来的“网络收音机”项目代码拷过来,双击运行直接白屏?或者播放一会儿就卡成PPT,CPU占用率飙到80%?别急着删掉重装。这种“复制来的代码跑不通不知道怎么调”的窘境,在接手老旧或外包项目时…

2026/9/22 3:11:52 阅读更多 →
机器人的分类完整示例

机器人的分类完整示例

机器人分类代码跑不通?3招搞定性能优化 刚毕业进游戏公司,接手旧项目的机器人脚本,复制过来直接报错?别慌,这坑我踩过。很多新人以为分类逻辑很简单,写个 if-else 就完事了,结果一上线,几百个机器人同屏时帧率掉到个位数。这时候再谈…

2026/9/22 3:11:52 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →