最近 Emacs Master 分支提交了大量来自 Po Lu 大神的 xwidget 更新,很值得期待,比如:
这次最显著的效果就是,解决了以前的闪烁问题
这个特性会不会默认打开哦
主要是这个补丁 http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=61d049aaff2ede48d3d4b357bc1cb06447f15229
用x11来绘制
前一段时间看邮件列表讨论,有的开发者认为xwidget的路线是条死路,Po Lo 大神不认为,所以近期一直再修复,改进了许多,我的观点是,只要它不闪烁,就有价值,做做预览等功能也不错。
我感觉这个方式类似eaf的黏窗口,但只是猜测,不懂细节。
不是粘贴窗口,而是把XWindow作为Emacs的子控件,然后用 X11 offscreen 技术把不同Window的XWindow画面进行同步,但用的不是粘贴的技术。
而是每个平台用不同的控件作为Emacs的子控件,不同平台要写不同的窗口代码,维护代价比较高。
我看了他的源码实现,估计性能一般,期待以后有人测试一下。
好处是,估计 org-mode 这种文件里面可以 web/text 混合排版,这个没测试过。
Po Lu代码我看了,对底层图形还是比较了解的,这么多补丁令人敬佩。
我其实一直期望Emacs把那些蹩脚的插件从Emacs中去掉,比如 newsticker, gnus, emms 等等,这些插件在多媒体渲染和多线程上都不擅长。
把这些插件移动到Emacs外部后,Emacs核心可以专注在Elisp语言功能、执行效率、图形绘制性能、多线程等核心功能的提升上。
当然,这些都是美好的愿望,Emacs太臃肿,但同时也是它的好处,啥都有。
这个要看包的维护者了,如果包已经没有维护者,那还是留在原地好,因为emacs改接口的时候,最起码会照顾照顾它们,让它们能用,分出去的前提是要有人维护,不然分出去就代表废弃了
唉,这几块,看邮件列表里面往往是长篇大论但没有结论
因为讨论的人都是语言设计和图形编程菜鸟,很少有人像Po Lu这样,别废话直接干。
https://lists.gnu.org/archive/html/emacs-devel/2021-11/msg01459.html
Po Lu has already answered all your question, and we have already decided to add GStreamer support to Emacs.
RMS 说已经决定要加了
EDIT: 是我看错了,这个邮件并不是 RMS 发的
用 Emacs 剪辑视频指日可待?
要说明一下,X-Windows 下最接近其他窗口系统“子控件”的概念就是 Window。不管是 GTK+,还是 Xt,他们的“widget”都使用 Window 来实现的。不过 GTK+ 2.18 后就开始使用 client side windows,所以不是每个 GdkWindow 都会有 XID,也因此会导致 xwidget 闪烁。
而我用 X 服务器端的 Window 来实现 xwidget 是因为 Emacs 不使用来自于 GTK 的 cr_surface 来绘图,所以重新显示的过程中就会把 xwidget_view 的 GdkWindow 覆盖,导致闪烁现象。
我虽然用了 20 多年 Emacs,今日之前从来没有关注过这个论坛,所以我如果违背了论坛的风俗习惯或潜规则,敬请谅解,谢谢啊(
在我的测试中,依赖 GdkOffscreenWindow 做到画面同步不会对运行速度做到多大的影响(可以随便以 45 FPS 的速度运行装满 6000 条鱼的 webgl aquarium。)不过必须说到,只有 GTK+ xwidget 才需要使用 offscreen rendering,而 GStreamer xwidget 是通过动态改变 GStreamer pipeline 来实现的,可以任意利用硬件加速,不会影响速度或 CPU 效用。
我估计如果使用 WPE 来做 webkit widget 也能达到类似 GStreamer 动态管道的效果,能利用 WPE 的内置分头功能来做到不牺牲性能的分头化显示。
画面同步主要是照顾Emacs的视窗分屏设计,如果不做画面同步浏览器应用就会导致多实例的问题。 画面同步只要在 X11 Server端做,避免 Sever-Client 之间拷贝大量图形数据都不会卡顿。
我在EAF主要用 QGraphicsScene 和 QGraphicsView 来分别实现Emacs中 Buffer 和 View 的概念,Qt这两个库都是基于GPU来实现的,效率很高,而且支持Windows, Mac, Linux、 BSD等多个平台。
GDK的实现问题是只能兼顾Linux平台,不同平台要用不同的图形服务来分别写代码,维护代价要比EAF这种实现大很多,相当于在Emacs中实现跨平台的图形绘制API.
GSteamer我觉得没啥必要,API太复杂了,视频绘制Gtk/Qt默认的控件就足够了,如果视频编辑, 浏览器+JavaScript库就好了。
是啊,xwidget这种目标就是要在Server端实现才会不闪烁不卡顿。
GdkOffscreenWindow 支持任何 GDK 支持的平台,也包括 GNU/Linux 以外的各种 Unix 版本,和 MS Windows(不过这里的代码还依赖于 X-Windows)。而且,只要支持 XRender 和 MIT-SHM,GdkOffscreenWindow 中也能做到硬件加速,基本上不需要担心性能问题。
GStreamer widget 也做到了完整的画面同步,不会出现多实例问题。
我个人认为维护成本不是问题,而 EAF 的方式是无法在 Wayland 上实现的,因为 Wayland 禁止应用任意排放窗口。