A
Air官方
GTK 系应用的心脏是 glib 主循环(mainloop):事件源调度、超时、空闲回调、子进程监视全在它上面。把它与鸿蒙应用生命周期正确集成,是 GTK 路线的关键一课。
▍mainloop 的结构
glib 主循环维护若干事件源:文件描述符就绪、定时器、空闲任务、子进程状态。循环每轮:收集就绪源、按优先级分发回调。GTK 的绘制、输入、超时全走这套。它在自己的线程里跑(框架线程),与系统线程的关系就是上一篇讲的分层泵。
▍集成的两种形态
形态一,独占线程:mainloop 在专属线程跑,系统事件经队列投喂成自定义事件源(用 glib 的添加源接口把队列注册进循环)。这是 Air 工程的主流形态,框架改动小。形态二,合并到系统循环:把 mainloop 迭代挂在系统消息循环里每次跑一小步(上下文迭代接口)。改动大,除非有特殊需求不推荐。两种形态共同的要点:唤醒路径——系统事件到达时必须能让阻塞中的 mainloop 立即醒来(事件管道注册为文件描述符源是标准做法)。
▍优先级的艺术
glib 源有优先级:输入处理高于绘制、绘制高于空闲任务。移植时新增的源(触摸投喂、生命周期)优先级要放对:触摸与键鼠同级(响应优先),生命周期事件最高(前后台切换不能排队),自定义后台任务放空闲档。优先级放错的症状:绘制饿死输入(卡顿感)或输入风暴挤掉绘制(掉帧)。
▍退出与清理
应用退出时 mainloop 要优雅退出:先停新增源、再退出循环、最后释放上下文。真实坑:退出时循环里还有待处理任务,强制销毁上下文崩溃——退出前跑干队列(有限次迭代清空)是稳妥姿势。
▍后台行为
应用退后台时 mainloop 不必停,但要降载:绘制类源暂停、定时器降频,前台恢复。全程保活循环(动画定时器不关)是后台耗电的典型来源。
▍验收
触摸响应延迟、动画流畅度、前后台切换无卡死、退出无崩溃四项,配合 CPU 占用静止近零的检查。
有疑问欢迎在本板块直接发帖,我们会逐条回复。
▍mainloop 的结构
glib 主循环维护若干事件源:文件描述符就绪、定时器、空闲任务、子进程状态。循环每轮:收集就绪源、按优先级分发回调。GTK 的绘制、输入、超时全走这套。它在自己的线程里跑(框架线程),与系统线程的关系就是上一篇讲的分层泵。
▍集成的两种形态
形态一,独占线程:mainloop 在专属线程跑,系统事件经队列投喂成自定义事件源(用 glib 的添加源接口把队列注册进循环)。这是 Air 工程的主流形态,框架改动小。形态二,合并到系统循环:把 mainloop 迭代挂在系统消息循环里每次跑一小步(上下文迭代接口)。改动大,除非有特殊需求不推荐。两种形态共同的要点:唤醒路径——系统事件到达时必须能让阻塞中的 mainloop 立即醒来(事件管道注册为文件描述符源是标准做法)。
▍优先级的艺术
glib 源有优先级:输入处理高于绘制、绘制高于空闲任务。移植时新增的源(触摸投喂、生命周期)优先级要放对:触摸与键鼠同级(响应优先),生命周期事件最高(前后台切换不能排队),自定义后台任务放空闲档。优先级放错的症状:绘制饿死输入(卡顿感)或输入风暴挤掉绘制(掉帧)。
▍退出与清理
应用退出时 mainloop 要优雅退出:先停新增源、再退出循环、最后释放上下文。真实坑:退出时循环里还有待处理任务,强制销毁上下文崩溃——退出前跑干队列(有限次迭代清空)是稳妥姿势。
▍后台行为
应用退后台时 mainloop 不必停,但要降载:绘制类源暂停、定时器降频,前台恢复。全程保活循环(动画定时器不关)是后台耗电的典型来源。
▍验收
触摸响应延迟、动画流畅度、前后台切换无卡死、退出无崩溃四项,配合 CPU 占用静止近零的检查。
有疑问欢迎在本板块直接发帖,我们会逐条回复。
楼主
7 天前