大家好,我是本次 Treeland Vulkan Renderer 实验性支持的开发者LFRon。

先提前说一句现状:跟 @zccrs 大佬深入讨论过后,目前这套靠 AI 迭代出来的渲染方案,底层架构方向依旧存在瑕疵,但好歹桌面能够正常启动运行,对比开发初期全程白屏、完全无法使用的状态,已经算得上巨大突破。

今天完整复盘这一个多月从零攻坚渲染后端的全过程,从白屏崩溃到初见成果,全程依托 GPT-5.5、GLM-5.2 两大 AI 辅助编码,踩遍桌面图形开发各类经典大坑。

 

缘起:想让deepin桌面跑得更流畅

不少用户反馈 DDE 存在卡顿迟缓的问题,Treeland 虽已落地,其GLES2渲染后端实现已较成熟, , 但仍存在不少问题。一个多月前,我得知 wlroots 原生支持 Vulkan 渲染后端,而正好想到 Treeland 本身正是基于 wlroots 技术栈构建的渲染器,理论上完全具备适配条件。顺着这个思路,我就此踏上了开启 Vulkan Renderer 适配、优化桌面流畅度的漫长调试之路。

这次开发能顺利推进,离不开很多人的帮助:特别感谢 @罐子 大佬提供的CodeX,让我能不间断调用 AI 生成代码;也感谢 TG 群组里 deepin 官方开发大佬抽空答疑指导。

整体分工上,智谱 GLM-5.2 负责前期方案验证和最后 VRR 异步疑难问题修复,主体渲染代码全部由 GPT-5.5 完成。

相关 PR ,大家可以直接查看:https://github.com/linuxdeepin/treeland/pull/1032

提前合并修复的Treeland (已合并Vulkan Renderer补丁) : https://gitee.com/LFRon/treeland-fix-mirror/tree/master

最终成品视觉上和原版 GLES2 后端几乎无差别,目前无法解决的短板是 Blur 模糊效果和DXVK游戏运行时画面帧率并不低但是体感掉帧的问题,@zccrs 大佬也确认,现阶段 Vulkan 后端暂时做不了这个效果,且该架构仍需要进一步改变, 后续我会持续跟进优化。

第一阶段:无脑丢需求给 AI,开机直接白屏

最刚开始我对 Treeland 整体架构一窍不通,分不清 Qt、wlroots 各自承担什么工作,也不懂 Vulkan 渲染后端的完整流程,只简单跟 AI 说了一句:帮我给 Treeland 实现 Vulkan Renderer。AI 手里没有完整源码,只能凭空猜测逻辑,代码生成完,我设置WLR_RENDERER=vulkan启动桌面,屏幕一片纯白,完全无法使用。

我才反应过来,大型项目不能只给 AI 一句模糊的需求。于是我把 Qt6、Qt6-Wayland 全套源码全部喂给 AI,同时要求每一段代码都加上详细日志,方便后续定位报错。本以为补齐源码就能解决白屏,结果重启桌面依旧黑屏。连续调试几天心态直接崩了,干脆摆烂,一边打游戏放松,一边维护玲珑应用、更新 Deepin-CachyOS 内核,搁置了这次开发。

 

第二阶段:勉强显示界面,桌面组件大面积残缺

歇了几天还是手痒,重新拉上 AI 反复根据运行日志迭代代码,折腾很久终于能显示基础 UI。

可一进到桌面,DDM、窗口、控件大量元素缺失,画面支离破碎。我熬到凌晨一点不停加日志、跑程序、把报错丢给 AI 修复,折腾一整晚毫无进展,又一次摆烂停工。

后来我换 GLM-5.2 重新实现整套渲染逻辑,结果问题一模一样。追问 AI 根源才明白:如果同时把 Qt QML RHI 和 wlroots 两套渲染后端全部切 Vulkan,图形生命周期管理会出现大量冲突,渲染逻辑彻底乱套。

一筹莫展时,我去 deepin 开发 TG 群求助,@大天使 大佬一句话点醒我:只需要把 wlroots 切换 Vulkan,Qt QML 继续保留原生 OpenGL (EGL) 后端就行。按照这个思路调整代码,捣鼓几小时后桌面终于完整显示,当时特别激动,还专门发了社区帖子分享阶段性成果:https://bbs.deepin.org.cn/post/299209

 

第三阶段:显存疯狂泄漏,amdgpu 内核态驱动直接崩溃

刚解决显示问题,新的性能 bug 又接踵而至:只要我开编译等高 CPU 负载任务,显存会持续泄露,直接把 amdgpu 内核驱动搞崩;同时 QML 桌面动画、特效卡顿严重,流畅度完全达不到预期。

连续两个晚上让 AI 加日志、优化渲染逻辑,始终没能根治问题。没办法,我先把半成品提交 PR,再次暂停开发。没过多久,我收到了 @zccrs 大佬在 PR 下的详细评审回复,看完我才彻底理清底层架构的致命缺陷。

我让 AI 分析这套方案性能拉胯的核心原因,得到的答案一下点透了我:QML 先用 OpenGL 把整幅画面渲染到 dmabuf 缓冲,之后 Vulkan 还要读取缓冲像素再重新绘制一遍上屏,等于重复渲染,造成极大性能浪费。顺着大佬的评论,我慢慢吃透 Treeland 完整工作流程:QtQuick(QML)负责合成整屏画布,再把画布交给 wlroots 完成最终上屏。弄懂这套逻辑后,我决定更换方案,让 Qt QML RHI 同步切换到 Vulkan,实现全链路 Vulkan 渲染。

 

第四阶段:借鉴安卓图形架构,找到一种可实验性实现的思路

全链路 Vulkan 改造上线后,又回到了之前界面残缺的老问题。但这时候我已经吃透整套项目架构,很快定位根源:Treeland 里 QML 画布和各个应用 OpenGL 渲染的生命周期存在大量兼容问题。

苦思冥想时,我想到安卓 AOSP 的 HWUI Vulkan 方案,安卓系统 UI、特效跑 Vulkan,第三方应用依旧使用 OpenGL ES,中间靠 Buffer 中转画面。我立刻让 AI 检索安卓源码与官方开发文档,搞懂 SurfaceFlinger 合成上屏的完整逻辑。

结合 Treeland 架构,我想出一套至少能亮屏的适配方案:各个应用保持自身 OpenGL/Vulkan 渲染,输出像素缓冲;QML 直接读取缓冲合成画布、叠加各类桌面特效,最后统一交给 wlroots 上屏,完美避开复杂的图形生命周期冲突。

我把 Qt、wlroots、libdrm 全套源码 + 完整架构思路发给 AI 论证,确认方案可行后让 AI 落地实现。仅仅两次代码迭代,桌面 UI 就能正常渲染,只剩光标异常、DTK 应用画面刷新延迟两个小问题。

之后我通过新增环境变量、分层打印日志精准定位剩余 bug,删掉大量拖慢性能的防御性冗余代码,短短三四天,一套完整可用、稳定运行的 Treeland Vulkan Renderer 就打磨完成。

Vulkan后端的Treeland性能表现不错:在优化不佳的游戏上(用Proton+Vkd3d跑)一样能跑到60fps以上。但现在仍存在画面体感卡顿(帧调度)问题

 

折腾一个多月,我最大的感悟

这次全程依靠 AI 辅助编码,也踩了无数大坑,让我对 Vibe Coding 有了很深刻的体会:GPT、GLM 这类大模型写代码能力确实很强,但它没办法自主梳理大型项目的整体架构。想借助 AI 高效完成复杂项目开发,三点缺一不可:

  1. 自己先理清项目整体技术架构、模块之间的协作逻辑;
  2. 明确完整实现流程、数据流转路径,给 AI 划定清晰开发方向;
  3. 提供完整源码、运行日志、业务限制,约束 AI 的代码编写范围。

如果只简单丢一句需求,AI 会脱离项目实际凭空写代码,像我最初那样,直接出现白屏、界面残缺、驱动崩溃等严重问题,白白浪费大量调试时间。

 

最后想说

就像开头提到的,@zccrs 大佬看完代码后指出,当前这套 AI 迭代出来的架构仍有很大的优化空间,后续我会顺着专业意见持续重构优化,力争实现更丝滑更低占用的 DDE 桌面体验。大家有测试问题、优化想法,都可以去deepin社区论坛留言和我交流!

顺带说一句,我参与的另一个项目Better Deepin Repo,龙芯架构(新世界ABI2.0)实验性上线了 ,欢迎体验反馈 https://bbs.deepin.org.cn/zh/post/299615

 

deepin 作为在 DistroWatch 全球排名中表现亮眼、广受全球用户认可的开源操作系统诚邀所有热爱开源的朋友,加入我们的 deepin 共建队伍,无论你是技术大牛,还是刚入门的技术爱好者,只要你认同开源精神,愿意为 Linux 生态贡献一份力量,这里都有你的一席之地。