如果你和我一样,习惯在 Windows、macOS 和 Linux 三套系统之间来回切换办公,就一定体会过那种“同一个工具换个系统就变了个样”的别扭。上个月我在开源社区翻到 OpenMontage 这个项目,一下子被吸引了——它想做的事,是把跨平台图形界面的基础设施整合到一条完整的工程链路里,让上层应用在桌面端和 Web 端呈现出几乎一致的体验。这篇文不是官方文档的翻译,而是我从零构建、试运行和二次开发 OpenMontage 的完整记录,适合正在做跨平台 GUI、想参与开源项目,或者准备从传统控件转向混合渲染方案的开发者参考。
我自己的背景是 C++ 出身,做过几年 Qt 桌面应用,后来因为业务需要接触了 Web 前端和嵌入式 Linux,所以对“同一套界面逻辑如何在不同系统上保持稳定”这个话题有切肤之痛。OpenMontage 吸引我的第二个点是它没有像很多新项目一样默认投靠 Electron,而是走了一条更硬核的路线:原生窗口框架加自绘渲染,底层用现代 C++ 构建,目标和 OBS、浏览器引擎这类项目站在同一个技术层面。这意味着它的构建门槛不低,但一旦跑通,你能学到的东西远不止“怎么调用一个 UI 库”。
下面我把整个经历拆成几个部分来讲,包括项目定位、构建流程、核心模块拆解、踩坑过程,以及最后我如何基于它做二次开发和性能优化。如果你也想动手试,可以直接照着操作。
1. OpenMontage 是什么:跨平台 GUI 项目背后的核心价值
1.1 项目定位:一个“蒙太奇式”的界面组合框架
OpenMontage 这个名字挺有画面感。Montage 是电影剪辑里的“蒙太奇”,指的是把不同镜头拼接在一起,形成新的叙事效果。这个项目取这个名字,我理解有两层意思:第一层,它本身擅长把多个窗口、画面、数据面板拼接进一个统一的界面里,类似一个界面层的“剪辑台”;第二层,它希望把不同操作系统底层的窗口管理差异“剪辑”掉,让开发者面对一套统一的逻辑。
从项目公开仓库和更新记录看,OpenMontage 的核心是一套跨平台 GUI 基础设施,包含窗口管理、渲染管线、事件分发和一批内置控件。它的表现形式更像一个可嵌入的工作台框架,而不是那种开箱即用的完整办公软件。你可以把它理解成“用来造应用的框架”,而不是“应用本身”。这和很多知名项目类似:Qt 是框架,基于 Qt 写出的 WPS 才是应用;OpenMontage 是基础设施,基于它拼出的多画面监控台或运维面板才是最终产品。
这也是我决定深入研究它的原因。过去几年我在团队里见过太多“跨平台”项目最后做成了“四处打补丁”的项目:Windows 上用 Win32 写一版,macOS 上用 Cocoa 重写,Linux 上依赖 GTK,三套代码维护成本高到让人绝望。OpenMontage 想走的路,是用一层抽象把三者的差异挡住,上层全部用同一套 C++ 逻辑,这才是它真正的价值所在。
1.2 为什么还需要一个新的跨平台 GUI 框架
可能有人会问:Qt 已经很成熟了,为什么还要再做类似的东西?这个问题的答案,只有真正被 Qt 的授权策略、编译体积和控件风格折磨过的人才能体会。Qt 本身确实是工业级方案,但它的商业授权对小团队并不友好,LGPL 模式下动态链接的合规细节也容易让人踩坑。更重要的是,Qt 的控件外观在不同系统上总是带着一种“这是 Qt 程序”的识别感,想彻底自定义绘制,你得深入 QPainter 和样式表系统,学习曲线非常陡。
另一边是 Web 技术路线。Electron 开发效率确实高,界面表达力也强,但代价是内存占用轻松上几百兆,启动速度在机械硬盘上能达到好几秒。对于工具类软件——比如远程控制台、多机位监控面板、数据看板——这种开销是不够“专业”的,用户要的是像原生应用一样轻快。
OpenMontage 的选择介于两者之间:用原生语言管理窗口和系统资源,用 GPU 自绘渲染界面,同时支持类似 Web 的布局描述能力。这种混合方案在业界已经有成功先例,OBS Studio 用原生代码加自绘 UI 做到了极低的资源占用和极高的可定制性,浏览器引擎用 Renderer 加 GPU 合成把复杂界面跑到了 120 帧。OpenMontage 的思路是基于这些成熟经验再往前走一步,把窗口拼接和画面组合作为第一公民。
1.3 它实际解决哪些场景的问题
我梳理了一下适合使用 OpenMontage 的应用类型,主要有这么几类:
第一类是技术运维工具。比如一个服务器监控台,需要同时显示多台主机的 CPU、内存、网络曲线和日志流。如果用传统控件,界面会非常松散;用 OpenMontage 这种组合式框架,可以把多个独立面板拖拽、缩放、吸附,就像在操作一个自己的导演台。
第二类是内容创作辅助工具。视频直播中的多机位画面预览、录制现场的多路信号监看,本质上是“把多个输入源拼到一个画面里”,这正是 Montage 的名字含义所在。
第三类是数据可视化桌面端。Web 上有 ECharts、D3.js 这类成熟库,但桌面端一直缺一个能把数据面板和原生窗口控制结合得足够紧密的框架。OpenMontage 的渲染层允许直接嵌入纹理和绘制命令,做实时数据大屏会比较顺手。
它适合谁呢?我觉得主要是有 C++ 基础、想深入理解桌面 GUI 底层原理的开发者,以及在业务中确实需要跨平台统一界面方案的技术负责人。如果你完全不会 C++,直接上手会比较吃力,建议先补一补现代 C++ 的基础再来看它。
2. 从零跑通 OpenMontage:环境准备与构建全流程
2.1 不同平台下的依赖清单
OpenMontage 的构建不是一个pip install就能搞定的事,它涉及编译器、构建系统和若干图形库。我先后在 Ubuntu 22.04、Windows 11 和 macOS 13 上各试了一遍,把关键依赖整理成了一张表,方便你对号入座:
| 组件 | Linux (Ubuntu 22.04) | Windows 11 | macOS 13 |
|---|---|---|---|
| 编译器 | GCC 12+ / Clang 16+ | MSVC 2022 (推荐) / MinGW-w64 | Xcode 15+ 自带的 Clang |
| 构建系统 | CMake 3.22+、Ninja | CMake 3.22+、Ninja | CMake 3.22+、Ninja |
| 图形相关 | SDL2、OpenGL ES 3.0 驱动 | SDL2、Direct3D 11 (可选) | SDL2、Metal 支持 |
| 加速工具 | ccache、LLVM Slim Build | ccache (可用) | ccache |
| 可选依赖 | OpenVINO 2025.0 (AI 推理模块) | 同上 | 同上 |
一个很容易被忽略的点是编译器版本。我在 Ubuntu 上最初用系统自带的 GCC 9 编译,直接报了一堆std::filesystem相关错误,因为 GCC 9 对 C++20 的支持还不完整。后来换成 GCC 12,一切顺利。所以强烈建议你先确认编译器版本,再开始拉代码,不然会浪费很多排查时间。
2.2 LLVM Slim Build 与 ccache:两个容易被忽略的性能开关
OpenMontage 的知识库里特别提到了一个配置:LLVM Slim Build。这个是给 Clang/LLVM 工具链准备的优化选项,目的是在构建时只生成后端所需的最小化代码,而不是完整的工具链。如果你自己编译过 LLVM 就会知道,完整构建一次要几十分钟甚至几小时,磁盘占用能到几十 GB。Slim Build 能把体积和耗时都砍掉一大截,适合 CI 环境和本地反复迭代。
我的建议是,如果你不打算深度修改编译器相关代码,就没必要自己折腾 LLVM,直接用系统包管理器装 Clang 就够了。但如果你需要把 OpenMontage 内嵌的脚本引擎或浏览器渲染组件升级到较新版本,知识库里的做法是先用 Slim Build 生成一个轻量工具链,再拿它去编译项目本体,这样能把整个升级流程控制在半小时以内。
另一个强烈推荐的开关是 ccache。它的原理很简单:把编译结果缓存起来,下次编译如果源文件和参数没变,直接命中缓存,跳过后端编译。我的实际体验是,第一次全量编译用时约 12 分钟,清理后二次编译只用了 40 秒,速度提升非常明显。配置方式是在 CMake 命令前加上环境变量来指定 ccache:
export CCACHE_DIR=/opt/ccache export CC="ccache clang" export CXX="ccache clang++"如果不加这一步,编译器每次都会重新编同一个文件,形成大量无效的 CPU 消耗。
2.3 构建命令与首次运行
依赖装齐之后,构建本身其实不复杂,核心就是三条命令:
git clone --depth=1 https://github.com/OpenMontage/OpenMontage.git cd OpenMontage cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release \ -DOpenMontage_BUILD_BROWSER=ON -DOpenMontage_BUILD_TESTS=ON cmake --build build --parallel这里有几个参数值得解释一下。-G Ninja选择 Ninja 而不是默认的 Makefiles,是因为 Ninja 的增量构建速度更快,而且失败日志的可读性更好,它会直接指出哪一个目标失败,而不是给你一团乱麻。OpenMontage_BUILD_BROWSER=ON决定是否构建内嵌的浏览器渲染组件,如果你不需要加载 Web 页面,可以关掉,能省不少编译时间。测试组件建议先开着,后面跑验证会方便很多。
首次运行我建议先跑测试套件,再启动示例程序:
cd build ./bin/OpenMontage_tests --gtest_filter="*Window*:*Render*" ./bin/OpenMontage_demo如果一切正常,你应该能看到一个带多个可拖拽面板的窗口,里面有几个演示用的仪表盘和模拟画面。此时可以用鼠标拖拽面板边界、双击面板最大化、按快捷键切换布局,这些都是 OpenMontage 的核心交互能力。
首次运行如果崩了,最常见的原因有两个:一是运行时缺少动态库,Linux 上检查方式是ldd ./bin/OpenMontage_demo,把not found的库挨个补齐;二是 GPU 驱动不支持 OpenGL ES 3.0,这种情况在虚拟机里尤其常见,建议先在物理机上跑,或者在虚拟机上开启 3D 加速。
3. 核心模块拆解:界面架构与自定义渲染管线
3.1 界面层:从传统控件到混合渲染的必然性
我最初看 OpenMontage 的目录结构时,发现它没有把界面控件做成传统意义上的 Widget 树,而是用一种更接近游戏引擎的“场景图加绘制列表”的方式组织画面。每个可显示的东西被抽象成一个 Node,Node 可以嵌套、可以变换、可以持有纹理或绘制命令,最终由渲染线程统一输出到窗口。
这种设计在传统桌面 GUI 里不太常见,但在游戏引擎和 OBS 这类图形密集应用里是标准做法。它的好处有两个:第一,控件的绘制完全由自己控制,不再依赖操作系统或第三方控件库的外观,所以 Windows 和 Linux 上呈现出来的观感可以做到高度一致;第二,渲染输出可以走 GPU 管线,对动画、模糊、混合这类效果的支持比普通控件系统强得多。
代价是你要接受它是自绘的,这意味着一些在 Qt 里现成的东西,比如文本框或下拉菜单的输入法处理,需要重新实现或集成。OpenMontage 的处理方式是把原生层的文本输入用 SDL2 的文本输入事件桥接出来,底层存储和光标绘制自己完成。这个设计思路和浏览器里<input>的渲染方式很像,先获取系统输入法文本,再交给自绘引擎排版绘制。
3.2 渲染管线:多显示设备与延迟控制的关键
OpenMontage 这个名字既然带 Montage,就说明它对“多画面组合”有硬性要求。实际跑起来后你会发现,它的渲染管线把多显示器支持作为一等功能,而不是事后补丁。在聚合显卡输出的场景里,最影响体验的往往不是分辨率或色彩深度,而是画面撕裂和帧延迟。
画面撕裂的原因很简单:显示器在扫描画面时,显卡还没有把一帧完整画完,导致用户看到上半帧和下半帧来自不同时刻的图像。传统方案是开垂直同步(VSync),让显卡等到显示器刷新信号发出后再交换帧缓冲区。但多显示器场景下,两个屏幕的刷新率经常不一样——一台 144Hz,一台 60Hz——如果你把两个画面同步到一个固定的 VSync 信号上,要么高档屏浪费性能,要么低档屏频繁丢帧。
OpenMontage 的做法是给每个输出独立管理 Present 模式,优先使用硬件 FIFO,只在必要时回退到软件同步。我在代码里看到它维护了一个SwapChainConfig结构,里面区分了不同显示器各自的刷新率、旋转角度和缩放模式。实际使用中,我外接了一台 2K 144Hz 显示器和一台 1080p 60Hz 显示器,分别放置两个面板,画面滚动时没有出现互相拖累的情况。
3.3 事件分发:跨平台输入与手势的抽象层
窗口画得再漂亮,输入如果混乱,体验也会瞬间归零。跨平台 GUI 最容易出问题的就是输入事件:Windows 的鼠标消息、macOS 的 NSEvent、Linux 的 X11/Wayland 事件,格式完全不同,键盘布局差异更是防不胜防。
我在 OpenMontage 里看到的事件层有个比较聪明的设计:它把底层输入先统一转换成内部事件结构,比如KeyEvent、PointerEvent、AxisEvent,然后加入一个带时间戳的环形缓冲区,由 UI 线程按帧节奏消费。这样做的结果是把“事件产生”和“事件处理”解耦,输入频率再高也不会因为 UI 线程卡顿而丢失,而是按时间顺序公平地进入下一帧。
对触摸板和触摸屏的支持上,项目内置了一套手势识别器,可以把原始触摸数据归约为平移、缩放、旋转等语义手势。我在 Linux 笔记本的触摸板上测试双指滚动手势,表现接近 macOS 的平滑度,这在普通 Qt 程序里很难做到。
4. 踩坑实录:我在交叉编译和显示链路修复中遇到的问题
4.1 第一个坑:Windows 下 MinGW 与 MSVC 的 ABI 冲突
我刚开始在 Windows 上构建时贪图省事,直接用了 MinGW-w64 版本的 SDL2,想着反正都是 C 接口,应该没问题。结果链接阶段一切正常,运行时却不断随机崩溃,有时候启动即闪退,有时候拖动面板时挂掉。用调试器一看堆栈,完全符号化不了,只能看到各种陌生的内存地址。
接下来的排查过程让我印象深刻。我先用工具检测了主程序和依赖库的异常处理模型,发现 MinGW 版 SDL2 用的是 SEH(结构化异常处理),而我用 MSVC 编译的主程序也是 SEH,按理说不至于崩。继续深挖才发现,问题出在 C++ 标准库的std::string内存布局上——MinGW 的 libstdc++ 和 MSVC 的 STL 实现不同,我在代码里把一个从 SDL2 回调拿到的字符串传给了主程序,内部指针格式不兼容,直接踩坏堆。
这个坑的教训是:Windows 生态里,尽量让所有 C++ 依赖和主程序保持同一个编译器链。如果某些第三方库官方只给了 MinGW 构建,那你得想清楚它是纯 C 接口还是包含 C++ 接口。OpenMontage 官方文档也明确建议 Windows 上用 MSVC,我当时没有认真看,白白折腾了一个下午。后来我老老实实把所有依赖换成 MSVC 构建,问题彻底消失。
4.2 第二个坑:Wayland 下的窗口失焦问题
Linux 上的测试也没省心。我在 GNOME 环境(默认 Wayland 会话)下启动 OpenMontage,窗口能正常出现,但一旦把鼠标移到另一个窗口再移回来,OpenMontage 就收不到焦点恢复事件,面板上的快捷键全部失效,感觉像窗口“僵住”了。
我一开始怀疑是 SDL2 的事件循环问题,于是查SDL_GetWindowFlags,发现窗口状态里根本没有SDL_WINDOW_INPUT_FOCUS标志。查了系统环境变量,确认当前会话确实是 Wayland:echo $XDG_SESSION_TYPE输出wayland。在 X11 下同样的程序完全没有这个问题。
进一步排查发现,Wayland 的焦点管理逻辑和 X11 完全不同。X11 里,焦点变化会广播给所有客户端;Wayland 里,只有拿到焦点的 surface 才能接收键盘事件,而且如果程序在失去焦点时没有正确处理恢复机制,compositor 不会再主动通知。OpenMontage 内部维护了一个焦点状态缓存,如果缓存没被正确更新,后续事件就会被当成仍处于失焦状态。
最终解决方案分两步:第一步,把窗口恢复的逻辑从“等系统通知”改成“在输入事件到达时主动检查并重置焦点状态缓存”;第二步,在需要全局快捷键这类高级功能时,强制要求走 XWayland 兼容层或者调用xdg-desktop-portal的请求器接口。这个坑让我意识到,Wayland 下开发 GUI 程序,不能照抄 X11 时代的思维模型。
4.3 第三个坑:多显示器时垂直同步失效
第三个问题是我在测试多屏显示时遇到的。OpenMontage 的主窗口放在 144Hz 显示器上,副窗口放在 60Hz 显示器上,播放一段水平滚动的数据流。最初几十秒画面正常,随后 60Hz 副显示器上开始周期性出现撕裂条。
我用渲染自带的覆盖层打开输出统计,发现副屏的 Present 模式从FIFO变成了Immediate,垂直同步被驱动主动降级了。原因可能是 GPU 资源紧张,也可能是两个显示器共用同一个 DMA 通道时,驱动为了保高档屏强行调整了低档屏的同步策略。
我尝试在代码里把副屏的队列深度从 3 降到 2,撕裂减少但没有根治;接着我改了逻辑,让副屏的渲染帧率跟随其物理刷新率而不是主屏的刷新率,同时打开自适应帧率开关。实测 20 分钟后,撕裂完全消失,副屏的帧率稳定在 60fps。最后我把这套配置封装成了一个按显示器自动应用的策略:主屏高帧率、副屏正常帧率、不盲目追求全局统一 VSync。
5. 从个人 DIY 到开源共建:如何有效参与 OpenMontage 项目
5.1 入门路径:从 issue、三方移植到核心 PR
跑通一个项目之后,下一步自然是希望回馈社区。我在参与 OpenMontage 之前已经给几个开源项目提过 PR,但大多停留在修文档和改配置的层面。这次我想动真格,所以先花了一个晚上把项目里的docs/dev目录从头读了一遍。
我的建议是,第一次 PR 不要碰渲染管线和窗口管理这类核心模块,因为你不了解设计者的取舍,贸然修改的风险很高。更合适的三类入口是:新增一个示例、完善某个平台的构建脚本、给现有组件写测试。这些工作既不依赖对核心架构的深刻理解,又是项目真正需要的东西。社区维护者在 issue 里通常会标记good-first-issue或help-wanted,从这些任务入手最稳妥。
在动手之前,先把仓库的CONTRIBUTING.md读一遍,了解他们期望的提交规范。OpenMontage 使用的是 Conventional Commits 风格,PR 标题在合并时会直接成为 release note,所以格式是type(scope): subject,例如fix(renderer): correct surface resize for Wayland。第一次提交时我把 PR 主题写成了“修复一个 bug”,被机器人打回要求重写,最后改成fix(input): reset focus state cache on new key event才算通过检查和 CI。
5.2 性能分析:用 perf 与 Tracy 定位 UI 卡顿
我自己遇到的一个真实案例:在公司的一台核显笔记本上跑 OpenMontage,拖动一个包含大段日志的面板时,帧率时不时掉到 20fps。直觉告诉我问题可能在绘制调用太频繁,但直觉不能代替数据。
我先用 Tracy 的轻量埋点模式跑了一遍,没法直接给出结论,因为瓶颈不在某一个单帧的 CPU 时间,而是一个随事件触发的纹理上传操作。通过 Tracy 的时间线视图,我看到每次滚动结束后,渲染线程会发出一个UploadTexture调用,而它内部同步等待了 24 毫秒。进一步定位发现,这个等待发生在 GPU 和 CPU 之间的同步点:纹理上传命令提交得太早,GPU 还在执行前几帧的绘制任务,CPU 只能阻塞等待队列清空。
解决方法也很典型:把纹理上传移到后台线程,上传完成后再通过异步回调告诉渲染线程直接使用已有纹理,中间省掉一轮同步等待。改了之后,掉帧场景消失,滚动期间平滑保持在 55fps 以上。
如果你手头没有 Tracy,Linux 上用 perf 也能做类似定位。perf top -p <pid>看热点函数,配合Ctrl+C后生成的符号列表,通常能在几分钟内找到是哪个调用占了 CPU 大头。再配合addr2line定位到具体源码行,比瞎猜高效得多。
5.3 一个最小化补丁的提交流程
我提交过的一个最小化 PR 是给某面板组件增加“双击恢复默认尺寸”的功能。整个流程可以用一个清单概括:
1. 创建特性分支:git checkout -b feat/reset-panel-size 2. 修改代码:在事件处理函数中增加双击检测,发送内部命令 3. 补测试:新增一个单元测试,模拟双击动作并验证尺寸回滚 4. 本地跑全部相关测试:./bin/OpenMontage_tests --gtest_filter=*Panel* 5. 提交:git commit -m "feat(panel): reset size on double click" 6. 推送到 fork 和 PR,关联原始 issue 编号关键点是测试前置。很多第一次提交代码的人容易忽略这一点,提交的代码能编译通过就觉得足够了。但 CI 跑的不是“能不能编译”,而是“有没有破坏已有行为”。如果你提交的功能没有配套测试,维护者通常会要求你补上,你还要重新走流程,浪费时间。第一次提交时我就在 PR 评论里被要求“请补充double_click_resets_size的测试”,虽然改起来不复杂,但来来回回多花了大半天。
另外一个务实的建议是,PR 提交前先在本地跑一遍项目的格式化工具,比如 clang-format。不同项目的代码风格差异真的很大,OpenMontage 用的是 120 列宽、4 空格缩进。如果格式不合规,CI 会直接报红,这种失败完全可以在本地避免。
6. 我的性能调优笔记与后续扩展思路
6.1 实测数据:不同硬件配置下的帧率与内存占用
为了搞清楚 OpenMontage 的性能底线,我在三台设备上做了同样的测试:启动内置的 6 面板演示布局,并开启 30fps 的仪表盘动画,观察帧率和内存。结果如下:
| 设备 | CPU | GPU | 平均帧率 | 峰值内存 |
|---|---|---|---|---|
| 入门轻薄本 | i5-1240P | Iris Xe | 48fps | 212 MB |
| 中型工作站 | Ryzen 7 5800X | RTX 3060 | 118fps | 268 MB |
| Linux 服务器 | Xeon Silver | 无独显 | 31fps | 205 MB |
可以看到,在完全没有独显的机器上,帧率掉到了 30fps 左右,但界面依然可用,没有出现明显的操作卡死。内存占用稳定在 200 多 MB,对比 Electron 动辄 500MB 起步的体量,优势很明显。当然这个比较并不完全公平,OpenMontage 的控件丰富度目前还远不如成熟的 Web UI 体系,但它证明了“原生自绘 + GPU 加速”的路线在资源控制上的潜力。
6.2 优化方向:缓存、纹理图集与着色器预编译
在 OpenMontage 上做性能优化,我总结了几个立竿见影的方向,按收益从高到低排列:
第一是纹理图集。在自绘 UI 中,大量小图标如果单独上传纹理,每一帧都要做多次 bind 操作,GPU 的切换开销很可观。把这些小纹理打包进一张大图集,渲染时只需绑定一次,绘制调用数会显著下降。我在一个列表页里实测,整理图标资源后,绘制调用从 320 次降到 37 次,帧率从 52 提升到 78。
第二是着色器预编译。OpenMontage 支持运行时动态生成着色器,但每次首次绘制都要等编译,可能卡顿半秒。把这些着色器在启动阶段预编译并缓存到磁盘,后续启动时直接加载二进制缓存,实测冷启动时间从 2.1 秒降到 1.4 秒。
第三是数据面板的懒刷新。日志流或监控曲线这类高频更新的内容,完全没必要每帧重绘。OpenMontage 允许你给某个面板设置 dirty 标记,只有标记为 dirty 时才重绘,静止内容自动跳过。这个优化对多面板布局尤其重要,我在一个四面板监控台上开了懒刷新后,CPU 占用直接下降了约一半。
6.3 扩展思路:插件化、脚本绑定与更多应用场景
最后聊聊它以后可以往哪些方向扩展。第一个是插件化。把一个 UI 框架做成类似 VST 那样的插件生态,第三方开发者可以按接口写自己的面板组件,通过动态库加载进 OpenMontage。这样项目就不只是固定一套控件,而是一个可持续生长的平台。第二个思路是脚本绑定。目前 OpenMontage 的配置和扩展主要靠 C++ 接口,对非 C++ 用户不友好。如果能把 Lua 或 Python 嵌入进去,提供一套 UI 描述 API,就能吸引更多前端开发者参与生态建设。
我到目前做的事情还停留在个人二次开发和基础贡献阶段,还没有到完整插件架构的程度。不过 OpenMontage 本身就是以 Montage 为核心意象设计的,我相信多模块组合、多源拼接这件事,未来会在它的插件 API 里体现得更充分。等到外面有更多人参与,它也许能成为跨平台 GUI 领域一个不可忽视的选择。