LoxodonFramework线程与调度器教程:线程执行器、定时任务与可拦截迭代器
【免费下载链接】loxodon-frameworkLoxodonFramework是一个轻量级的MVVM(Model-View-ViewModel)框架,它是专门为Unity3D游戏开发设计的,参考了WPF和Android的MVVM设计,它提供了视图和视图模型的数据绑定、本地化、一个简单的对象容器、配置文件组件、线程工具组件、应用上下文和玩家上下文,异步线程和协程的任务组件等基本组件,同时还提供了一个UI视图的框架。所有代码都基于面向对象面向接口的思路设计,几乎所有功能都可以自定义。而且在数据绑定部分进行了性能优化,避免值类型装箱拆箱,最小化垃圾回收的开销,使用动态委托/静态织入技术确保数据绑定和直接调用有相当的性能,0GC更新UI视图等等,它支持绑定到UGUI、UIToolkit和FairyGUI控件,同时也很容易扩展对其他UI控件的支持。此外,它已经在项目中得到验证(UWA评分SSS级,可在战斗中完全关闭GC,在6、7前手机都保证60FPS),性能优越,稳定可靠,架构清晰,可灵活扩展。 我们希望它能够帮助您更快、更轻松地开发游戏。 本框架使用C#语言开发,同时也支持使用XLua或者ILRuntime来开发,如果项目需要热更新,那么只要安装了XLua或者ILRuntime插件,则可以完全使用Lua或者ILRuntime来开发游戏。对于新立项的项目,建议使用HybridCLR来做热更新。 这个插件兼容 MacOSX,Windows,Linux,UWP,IOS and Android,WebGL等等,并且完全开源。项目地址: https://gitcode.com/vovgou/loxodon-framework
LoxodonFramework 是一个为 Unity3D 游戏开发设计的轻量级 MVVM 框架,除了数据绑定与视图管理外,还内置了一套完整的线程与任务调度组件。本教程将带新手快速掌握框架的三大执行工具:线程执行器(IThreadExecutor)、定时任务执行器(IScheduledExecutor)和可拦截迭代器(InterceptableEnumerator),让你轻松实现多线程耗时处理、延时与周期任务、协程异常捕获,让游戏逻辑不再阻塞主线程。
为什么 Unity 游戏需要线程与调度器 🧵
Unity 的所有渲染和 UI 操作都发生在主线程上。一旦你在主线程里做耗时工作——解析配置、压缩资源、循环计算——画面就会卡顿掉帧。因此游戏开发中经常需要:
- 把耗时逻辑放到后台线程,算完再回到主线程更新 UI;
- 让某个逻辑延时几秒后或每隔几秒自动执行;
- 给 Unity 协程加上异常捕获能力(协程里
try-catch无法跨yield生效)。
LoxodonFramework 的 Execution 组件正是为这三类需求而设计的,源码集中在 Runtime/Framework/Execution/ 目录下:
| 组件 | 接口 / 类 | 作用 |
|---|---|---|
| 线程执行器 | IThreadExecutor / ThreadExecutor | 在后台线程执行任务,支持结果返回、取消、进度上报 |
| 定时任务执行器 | IScheduledExecutor | 延时执行、固定频率/固定间隔周期执行 |
| 可拦截迭代器 | InterceptableEnumerator | 包装协程迭代器,注入条件块、异常块、Finally 块 |
| 统一入口 | Executors | 自动创建主线程执行器,负责跨线程调度 |
统一入口:Executors 主线程执行器
Executors 在运行时自动创建一个隐藏的MainThreadExecutor对象,负责把后台线程的任务"搬回"主线程执行。你不需要手动创建它,常用能力有:
Executors.RunOnMainThread(action):把action排队到主线程执行(见 Executors.cs#L146);Executors.RunAsync(func):在后台线程池执行函数并拿到结果(见 Executors.cs#L507);Executors.RunOnCoroutine(routine):启动协程并保证任务可靠结束。
所有数据绑定、UI 控件的更新都依赖主线程。比如框架中经典的 UI 数据绑定场景,控件值的刷新必须回到主线程完成:
线程执行器:把耗时任务丢到后台 ⚡
创建 ThreadExecutor 后,通过Execute提交任务。不同重载对应不同能力:传Action执行无返回值的任务;传Func<TResult>拿结果;传IProgressPromise<T>可以上报进度;所有重载都支持Cancel()取消任务。
官方示例 ThreadExecutorExample.cs 演示了完整流程,核心只有几行:
IAsyncResult r1 = executor.Execute(Task1); yield return r1.WaitForDone(); // 等待后台任务完成 IAsyncResult<string> r3 = executor.Execute<string>(promise => Task3(promise)); r3.Cancel(); // 取消任务,任务内检查 IsCancellationRequested在任务内部,可以随时检查promise.IsCancellationRequested来优雅地停止循环。框架的异步资源加载器也是同一套机制:把加载放到后台线程,完成后回主线程赋值,UI 全程不卡顿。
进度条:用 IProgressPromise 上报加载进度 📊
加载资源、导入数据时,玩家最希望看到进度条。线程执行器提供了带进度的重载Execute<TProgress, TResult>,任务内调用promise.UpdateProgress(0.37f)即可实时更新:
IProgressResult<float, string> r4 = executor.Execute<float, string>(promise => Task4(promise)); // 主线程中读取 r4.Progress 刷新进度条,完成后取 r4.Result定时任务执行器:延时与周期执行 ⏱️
IScheduledExecutor 提供了三种调度方法,参数单位为毫秒:
Schedule(command, 1000):一次性延时任务,1 秒后执行一次;ScheduleAtFixedRate(command, 1000, 2000):固定频率任务,1 秒后首次执行,之后严格每隔 2 秒执行,即使上一次没执行完也会按节拍触发;ScheduleWithFixedDelay(command, 1000, 2000):固定间隔任务,上一次执行结束后再等 2 秒执行下一次,适合任务耗时不定的场景。
框架提供了两个实现:
| 实现 | 运行线程 | 适用场景 |
|---|---|---|
| ThreadScheduledExecutor | 后台线程 | 纯逻辑定时刷新,不碰 Unity API |
| CoroutineScheduledExecutor | 主线程协程 | 定时操作 GameObject、UI 等 Unity 对象 |
使用方式和 ScheduledExecutorExample.cs 一致:
var scheduled = new ThreadScheduledExecutor(); scheduled.Start(); scheduled.ScheduleAtFixedRate(() => { /* 周期逻辑 */ }, 1000, 2000); // 退出时 scheduled.Stop() 停止调度器并取消未执行任务💡CoroutineScheduledExecutor还支持时间缩放:默认基于unscaledTime计时,传入true构造则跟随Time.timeScale——暂停游戏时定时任务也会暂停,非常适合做游戏内逻辑定时器。
可拦截迭代器:给协程加异常捕获 🛡️
Unity 协程有一个经典痛点:异常无法被捕获。try-catch不能跨yield,finally也不能保证执行,协程一报错就静默中断,排查极其困难。
InterceptableEnumerator 基于"协程本质是迭代器"的原理,把原迭代器包装起来,在每次MoveNext时拦截执行,并支持注册三类代码块:
- 条件块
RegisterConditionBlock:每帧返回false即中止协程(可用于取消任务); - 异常块
RegisterCatchBlock:捕获协程内抛出的任何异常; - Finally 块
RegisterFinallyBlock:无论正常结束还是异常,都保证执行,用于收尾和释放资源。
var enumerator = InterceptableEnumerator.Create(DoSomething()); enumerator.RegisterCatchBlock(e => log.Error(e)); // 捕获异常 enumerator.RegisterFinallyBlock(() => { /* 必然执行的收尾 */ });这个类内部还做了对象池复用(容量 128),配合框架的 0GC 更新目标,包装协程几乎不产生额外垃圾回收开销。
在 Executors 内部,所有协程任务都会经过WrapEnumerator包装:任务被取消时条件块返回false中止协程,异常时写入任务结果,结束时 Finally 块保证AsyncResult.IsDone = true——无论协程成功还是失败,任务都绝不会卡死,这也是框架在实战中稳定可靠的底层保证之一。
总结:三件套怎么选 ✅
- 要多线程跑耗时逻辑 → 用
ThreadExecutor+Executors.RunOnMainThread回主线程; - 要延时 / 周期执行 → 主线程用
CoroutineScheduledExecutor,后台线程用ThreadScheduledExecutor; - 要协程容错→ 用
InterceptableEnumerator包装,异常和收尾一步到位。
更多完整示例可参考官方文档 docs/LoxodonFramework.md 中的"定时任务执行器"章节,以及 Samples 目录下的 Basic Tutorials 场景。掌握这三件套,你的 Unity 项目将能轻松应对多线程、定时调度与协程容错的大部分场景。
【免费下载链接】loxodon-frameworkLoxodonFramework是一个轻量级的MVVM(Model-View-ViewModel)框架,它是专门为Unity3D游戏开发设计的,参考了WPF和Android的MVVM设计,它提供了视图和视图模型的数据绑定、本地化、一个简单的对象容器、配置文件组件、线程工具组件、应用上下文和玩家上下文,异步线程和协程的任务组件等基本组件,同时还提供了一个UI视图的框架。所有代码都基于面向对象面向接口的思路设计,几乎所有功能都可以自定义。而且在数据绑定部分进行了性能优化,避免值类型装箱拆箱,最小化垃圾回收的开销,使用动态委托/静态织入技术确保数据绑定和直接调用有相当的性能,0GC更新UI视图等等,它支持绑定到UGUI、UIToolkit和FairyGUI控件,同时也很容易扩展对其他UI控件的支持。此外,它已经在项目中得到验证(UWA评分SSS级,可在战斗中完全关闭GC,在6、7前手机都保证60FPS),性能优越,稳定可靠,架构清晰,可灵活扩展。 我们希望它能够帮助您更快、更轻松地开发游戏。 本框架使用C#语言开发,同时也支持使用XLua或者ILRuntime来开发,如果项目需要热更新,那么只要安装了XLua或者ILRuntime插件,则可以完全使用Lua或者ILRuntime来开发游戏。对于新立项的项目,建议使用HybridCLR来做热更新。 这个插件兼容 MacOSX,Windows,Linux,UWP,IOS and Android,WebGL等等,并且完全开源。项目地址: https://gitcode.com/vovgou/loxodon-framework
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考