网易 Duilib 框架概述
Duilib 是 Windows 零碎下的开源的 DirectUI 界面库(遵循 BSD 协定),完全免费,可用于商业软件开发。
Duilib 能够简略不便地实现大多数界面需要,包含换肤、换色、通明等性能,反对多种图片格式,应用 XML 能够不便地定制窗口,能较好地做到 UI 和逻辑相拆散,尽量减少在代码里创立 UI 控件。目前,Duilib 曾经在国内有较为宽泛的应用。
网易在研发网易易信 PC 版时引入 Duilib,通过多年开发和改良,由网易云信在 2019 年 4 月开源。(github 地址:https://github.com/netease-im…)
网易 Duilib 应用 C++11 重写,在其原有根底上做了较大重构,搭配谷歌的根底组件 Base 库、基于 Chromium 的 WebView 框架 CEF 以及罕用的 UI 组件,造成了一套 功能强大、简略易用 的残缺桌面 UI 开发框架。
网易 Duilib 整体框架
整体组件架构
框架中提供了多线程模型、高精度定时器、根本的 xml 解析、zip 解压等性能;封装了一层渲染接口和全局款式资源的对立治理;并且对 DPI 适配、多语言、虚构键盘、手写板等性能减少了反对;在下层提供了丰盛的控件。
线程模型和音讯队列
开发框架中集成了 Chromium 中 base 库的线程模型和音讯队列,base 中蕴含了多种音讯循环、异步操作接口。
网易 Duilib 框架中的 UI 音讯循环、工作线程都齐全依靠 base 的线程模型。应用 base 的异步通信能力,咱们能够将耗时的工作(如资源解析)放到辅助线程来加重 UI 线程的压力。
同时,网易 Duilib 中的各种根底组件,都曾经继承了 base 中的生命周期检测能力,每个工作在执行时都会先查看与之绑定的对象是否存活,确保多线程操作不会因野指针而导致解体。理论我的项目开发中,应用 base 的线程模型,咱们能够非常简单做到 UI 线程、数据库线程、网络线程、其余工作线程之间的通信与交互,无效晋升开发速度。
网易 Duilib 的性能特点
更加丰盛的性能
网易 Duilib 框架提供了更加残缺和丰盛的性能,以满足不同实在业务场景的需要:
- 丰盛的控件、繁难的布局
- 灵便的控件组合、事件处理形式
- 模块化反对
- 优化渲染效率
- 异形窗体反对
- DPI 适配反对
- 多国语言反对
- 通用款式反对
- 虚表控件反对
- 虚构键盘反对
- 实用的多线程反对
- CEF webview 反对
- 控件动画、GIF 动画反对
- 触控设施反对(Surface、Wacom)
- 形象渲染接口(为其余渲染引擎提供反对)
灵便的布局与组合
网易 Duilib 中,减少了控件与容器的尺寸自适应性能,免去繁琐的手写尺寸。同时加强了布局能力,搭配控件的一些定位属性,能够应用大量 xml 代码来实现更加弱小的布局成果。
当初的 UI 库中,把布局、容器、控件等逻辑组件拆离开,让不同的布局能够与任意容器进行灵便的组件。并且弱化了容器与控件的区别,根底控件应用模版来编写,下层应用时能够让它继承不同的控件或模版,让控件自身也能够是容器:
typedef LabelTemplate<Control> Label;
typedef LabelTemplate<Box> LabelBox;
typedef ButtonTemplate<Control> Button;
typedef ButtonTemplate<Box> ButtonBox;
typedef CheckBoxTemplate<Control> CheckBox;
typedef CheckBoxTemplate<Box> CheckBoxBox;
根底控件继承了容器后,就能够领有控件自身的行为 + 容器的组合能力。这样做的长处是如果一个根底组件在 UI 上无奈满足需要,那么就让他成为容器去任意组合其余的 UI 组件,晋升控件的体现能力。同时控件反对在 xml 中编写简略的事件处理逻辑,把一些性能简略的 UI 管制逻辑放在 xml 中。
功能强大的 web 展示组件:CEF WebView
CEF(Chromium Embedded Framework)是基于谷歌 Chromium 浏览器内核封装出的跨平台 web browser 组件。
CEF 外部有残缺的一套音讯循环,咱们将网易 Duilib 框架中的 base 线程模型与 CEF 音讯循环组合在一起。同时封装 CEF 的离屏渲染模式(OSR)、窗口模式为网易 Duilib 中的控件 CefControl、CefNativeControl,让 CEF 的 WebView 能力残缺的嵌入到网易 Duilib 中。最初咱们封装了 js 与 native 的通信能力 JsBridge。
如此,咱们能够应用 CefControl、CefNativeControl 来做单纯的 web 展现控件,也能够以 WebView 为外围,网易 Duilib 为辅助,开发 web app。UI 层的展示都由 web 页面负责,底层的外围逻辑、数据库、网络等由 C++ 负责,web 与 C++ 应用 JsBridge 通信。
利用实例:有道精品课
有道精品课是网易旗下在线教育平台,老师通过在线直播的形式对学生授课,须要一个反对 直播、聊天、课件分享、手写板、web、答题互动 等性能的客户端让老师应用,因而有道精品课老师端应运而生。
老师能够应用有道精品课老师端进行 PPT、PDF、桌面共享、iPad 投屏、视频播放等多种直播形式。老师也能够把讲课过程中画板上的板书和课件导出为 PDF 分享给学生。
咱们须要让老师端 满足各种直播需要的同时,保障开发的速度、易用性、扩展性。另外,因为音视频、聊天等性能须要耗费大量 CPU 资源,这就要求客户端的 UI 自身只能占用较低的内存和 CPU 资源。基于以上需要,咱们应用网易 Duilib 框架进行了有道精品课老师端的开发。
老师端的画板领有丰盛的性能:绘制各种图形图片、图形交互、书写文本、PPT 解析、动画、导出 PDF、缩放等等。
画板反对的个性越简单,就越须要耗费更多的 CPU。为了节俭 CPU 资源,咱们搭配网易 Duilib 框架中的渲染引擎,设计了 6 层缓存机制,让画板在反对丰盛性能的同时保障极低的 CPU 占用率。
依靠于网易 Duilib 框架的 UI 组件和渲染能力,老师端画板能够反对手写板笔迹、毛笔,反对绘制各种图形图片,反对画板缩放。
因为老师的课件大多为 PPT 编写,为了让老师授课更加不便,老师端反对导入 PPT。并且应用网易 Duilib 框架的动画能力,来反对展示 PPT 元素的动画,让老师不便播放动画或管制 PPT 元素。
配合网易 Duilib 框架的 WebView 能力,能够把 web 页面融入到画板里,既能够操作网页也能够写书板书,极大加强画板表现力。应用这样的能力,咱们能够让老师端反对展示数学互动题、物理试验、化学试验等等内容。
一直优化迭代,与开发者同行
目前,咱们曾经将网易 Duilib 开源,github 地址:
https://github.com/netease-im…
欢送大家应用并与网易 Duilib 同行。
打算在不久之后,咱们将反对矢量图来加强 DPI 适配能力,减少更加丰盛的动画(帧动画、属性动画、门路动画、特效动画)来晋升 UI 库的表现力,并替换性能更好的 skia 渲染引擎。
将来,咱们将继续迭代优化网易 Duilib 框架,一直的扩大它的性能。在 github 社区里,曾经有很多的开发者参加到我的项目的迭代中。
欢送更多开发者敌人的退出。
特地鸣谢:感激自网易 Duilib 成立以来,为之奉献过以及仍在奉献代码的小伙伴们,包含但不限于 阳光、redrain、harrison 等。
撰文 / Redrain
编辑 / Ryan
起源 / 有道技术团队(ID: youdaotech)