2.4 架构补充
当前内置指令步长为 64 float,支持质量、四角和高光/阴影色。GlyphAtlas 是原生 DPI 覆盖 + 标量 SDF 的双路径。几何共享 geometry.glsl,普通四角默认求三次曲线数值距离。其余控件、队列、生命周期架构沿用下述基础。
渲染与窗口架构
三个层次
Java 控件层:Widget / Ui / controls,负责状态、父子布局、焦点、捕获、剪贴板、通知和弹窗生命周期。Painter 是唯一绘制依赖。
Java 渲染适配:NativePainter 将形状和字形写入每条 64 个 float 的直接缓冲;GlyphAtlas 在缺字时使用系统字体生成缓存;NativeBackend 验证线程和生命周期并调用 JNI。
native / GLSL:绘制命令在 C 中分派为三类 shader program(glass / shape / text),背景与模糊另外使用全屏 program。控件不是 AWT/Swing UI 组件。
窗口后端
可选 DesktopWindow 使用 AWT Frame/Canvas 获取操作系统窗口、键鼠和 IME 事件。窗口标题栏属于系统,其内部图形控件全部使用 OpenGL。
Windows 通过 JAWT 取得 HWND,然后自行 GetDC 并保存。WGL context 在渲染线程初始化后保持 current;创建现代 compatibility context 时先验证再替换,失败保留/恢复 legacy context。保留 1.1.1 Hotfix 的主要生命周期处理。
Linux 使用 JAWT 取得 X11 drawable / visual,通过 GLX 创建上下文。核心宿主 attach 路径不创建 AWT 窗口,而使用调用方已经 current 的 context;它也经过宿主自建 EGL context 的测试。
一个进程当前只允许一个活动 NativeBackend,native 侧存在单实例资源。关闭后可以重新创建。此设计不是任意数量窗口和多个 OpenGL context 的完整资源管理器。
Shader
quad.vert:六个 gl_VertexID 顶点,转换逻辑坐标,生成图元包围矩形。没有 CPU 圆角曲面细分。
shape.frag:解析圆角矩形、线段、圆环弧线 SDF,使用 fwidth 控制抗锯齿;HSV 颜色面板也在片元中计算。
glass.frag:到边界的距离、解析法线、倒角强度、背景纹理采样位移、微弱 RGB 色散、窄亮边、较宽的边缘反射与鼠标光斑。
blur.frag:归一化、截断的 Gaussian kernel,横向/纵向两个独立 pass;权重与纹理采样在 GPU 中计算。
text.frag:缓存字形的 alpha 合成,文字在对应玻璃表面之后绘制。不是 CPU 绘制整个 UI 再上传一张截图。
细亮边和 Fresnel 风格的反射是视觉近似;没有宣称采用 Apple 私有材质算法或完全物理正确的介质光线追踪。
纹理读写
每层先把目标复制到独立 scene texture。模糊的输入与输出纹理分开。玻璃最终写回宿主 framebuffer,但读取的是冻结的 scene / blur texture,因此没有在同一个 framebuffer 附件上边读边写。
Backdrop barrier 会重新捕获已经合成的 UI,例如菜单需要显示其后方按钮和文字的模糊版本。当前正常 widget 绘制不会为每个圆角矩形都重新捕获一次背景。
UI 的形状不逐像素读回。唯一 framebuffer 读回是显式截图或测试;读取像素用来检查模糊和剪裁,不是正常渲染路径。
线程
AWT 事件线程只发送 UiEvent。主渲染线程消耗事件、执行 ui.post 队列、布局并生成指令。文件浏览器在守护线程读取目录,完成后通过 post 更新控件;其余控件状态不应在工作线程直接改动。
渲染循环在每帧末尾让出一定时间,避免软件驱动较慢时独占事件调度。本次测试环境用 llvmpipe,它确实执行相同的 shader 管线,但计算由软件 OpenGL 实现,不是硬件 GPU 性能基准。
2.4.1 裁剪命令
64-float 指令格式保持不变;新增 kind=10 压入形状裁剪、kind=11 弹出。协议版本 24164 防止混用旧 native。矩形 clip 保留为 scissor;新的轮廓参数由 GLSL 对每个片元求覆盖率,非 CPU 遮罩贴图。详见 裁剪修复。